#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)
Что противоречит вашему второму заявлению.