Issue
Sample code (t987.c):
void *NAME();
void *NAME(void *, int, unsigned);
Invocation:
$ 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 behavior
Question: why function name matters?
Solution
There's no other definition or declaration for memset1
. So these two declarations are compatible:
void *memset1();
void *memset1(void *, int, unsigned);
Because the first one says the number and type of parameters is unknown.
This however gives you a problem:
void *memset();
void *memset(void *, int, unsigned);
Because memset
is defined by the C standard and therefore considered part of the implementation, it is also internaly declared as:
void *memset(void *, int, long unsigned int)
Which conflicts with your second declaration.
Answered By - dbush