pmor
pmor

Reputation: 6306

gcc/clang: error: conflicting types for <function_name>: why function name matters?

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?

Upvotes: 2

Views: 649

Answers (1)

dbush
dbush

Reputation: 225757

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.

Upvotes: 6

Related Questions