gcc/clang: ошибка: конфликтующие типы для : почему имя функции имеет значение?

#c #gcc #compiler-errors #clang #diagnostics

Вопрос:

Пример кода (t987.c):

 void *NAME(); void *NAME(void *, int, unsigned);  

Вызов:

 $ gcc t987.c -c -DNAME=memset1 lt;nothinggt;  $ gcc t987.c -c -DNAME=memset lt;command-linegt;: error: conflicting types for ‘memset’; have ‘void *(void *, int, unsigned int)’ t987.c:2:7: note: in expansion of macro ‘NAME’  2 | void *NAME(void *, int, unsigned);  | ^~~~ lt;command-linegt;: note: previous declaration of ‘memset’ with type ‘void *(void *, int, long unsigned int)’ t987.c:1:7: note: in expansion of macro ‘NAME’  1 | void *NAME();  # clang: the same behavior  

Вопрос: почему имя функции имеет значение?

Ответ №1:

Для этого нет другого определения или декларации memset1 . Таким образом, эти два заявления совместимы:

 void *memset1(); void *memset1(void *, int, unsigned);  

Потому что в первом говорится, что количество и тип параметров неизвестны.

Однако это создает вам проблему:

 void *memset(); void *memset(void *, int, unsigned);  

Поскольку memset он определен стандартом C и, следовательно, считается частью реализации, он также внутренне объявлен как:

 void *memset(void *, int, long unsigned int)  

Что противоречит вашему второму заявлению.