外部函数的C声明未对#args不匹配发出警告 请考虑以下两个C文件。如您所见,func在file2.c中定义,但从file1.c调用 file1.c ------------------------------ extern int func(int a, int b); ::::: int some_func() { .... func(1,2); } ------------------------------ file2.c ------------------------------- int func(int a, int b, char *c, int d) { function body; } ------------------------------

外部函数的C声明未对#args不匹配发出警告 请考虑以下两个C文件。如您所见,func在file2.c中定义,但从file1.c调用 file1.c ------------------------------ extern int func(int a, int b); ::::: int some_func() { .... func(1,2); } ------------------------------ file2.c ------------------------------- int func(int a, int b, char *c, int d) { function body; } ------------------------------,c,C,问题: 为什么这段代码编译得很好,在以下方面没有警告/错误 参数不匹配,因为func实际上接受4个参数,但只提供2个 当我将file1.c中的'func'声明修改为 外部函数(内部a,内部b,字符*c,内部d) 然后,我从编译器(而不是链接器)获得适当的错误消息。我 假设它声明为extern链接器时,应该给我错误。 请纠正我哪里错了 我使用的是64位ubuntu 12.04,gcc版本4.6.3,这是完全正常的 C编译会生成一个(在Linux等上),例如,file1.o等。在该对象文件中,函数的

问题:

  • 为什么这段代码编译得很好,在以下方面没有警告/错误 参数不匹配,因为func实际上接受4个参数,但只提供2个

  • 当我将file1.c中的'func'声明修改为

    外部函数(内部a,内部b,字符*c,内部d)

  • 然后,我从编译器(而不是链接器)获得适当的错误消息。我 假设它声明为extern链接器时,应该给我错误。 请纠正我哪里错了


    我使用的是64位ubuntu 12.04,gcc版本4.6.3,这是完全正常的

    C编译会生成一个(在Linux等上),例如,
    file1.o
    等。在该对象文件中,函数的签名不保留(仅保留其名称)。FWW,C++,但不使用C来编码函数的签名。< /P> 正确的方法是在一些常见的
    myheader.h
    中声明
    func
    的正确签名,并
    #在
    file1.c
    file2.c
    中包含
    func
    (然后带有不兼容签名的
    func
    的定义将给出诊断消息)

    顺便说一句,如果您编译并链接了
    gcc-flto-Wall-g
    (至少是最近的gcc 4.9),即链接时间优化、几乎所有警告和调试信息,您可能会得到一些警告


    <>你的GCC 4.6很旧,你应该考虑升级它。

    另外, ExtNux/Cuff>在这种情况下是多余的。谢谢Basile Starynkevitch解释的答案。