Search code examples
cgcccompiler-errorsclangdiagnostics

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?


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.