【问题标题】:gcc/clang: error: conflicting types for <function_name>: why function name matters?gcc/clang:错误:<function_name> 的类型冲突:为什么函数名很重要?
【发布时间】:2021-10-19 12:02:33
【问题描述】:

示例代码 (t987.c):

void *NAME();
void *NAME(void *, int, unsigned);

调用:

$ 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

问题:为什么函数名很重要?

【问题讨论】:

    标签: c gcc compiler-errors clang diagnostics


    【解决方案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)
    

    这与您的第二个声明冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多