Código de muestra (t987.c):
void *NAME(); void *NAME(void *, int, unsigned);Invocación:
$ gcc t987.c -c -DNAME=memset1 <nothing> $ gcc t987.c -c -DNAME=memset <command-line>: 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); | ^~~~ <command-line>: 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 behaviorPregunta: ¿por qué es importante el nombre de la función?
No hay otra definición o declaración para memset1 . Así que estas dos declaraciones son compatibles:
void *memset1(); void *memset1(void *, int, unsigned);Porque el primero dice que se desconoce el número y tipo de parámetros.
Sin embargo, esto te da un problema:
void *memset(); void *memset(void *, int, unsigned); Debido a que memset está definido por el estándar C y, por lo tanto, se considera parte de la implementación, también se declara internamente como:
void *memset(void *, int, long unsigned int)Lo cual entra en conflicto con su segunda declaración.