gpt4 book ai didi

extern 函数的 C 声明没有发出关于 #args 不匹配的警告

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:47 28 4
gpt4 key购买 nike

请考虑以下两个 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;
}
------------------------------

问题:

  1. 为什么这段代码编译得很好,没有警告/错误 参数不匹配,因为 func 实际上需要 4 个参数,但只提供了 2 个。

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

    extern int func(int a, int b, char *c, int d);

然后我从编译器而不是链接器得到适当的错误消息。我假设它被声明为外部链接器应该给我错误。不对的地方请指正。

我在 64 位 ubuntu 12.04,gcc 版本 4.6.3

最佳答案

这是完全正常的。

C 编译生成一个 object file (在 Linux 等上的 ELF 中...),例如file1.o 等。在该目标文件中, 保留函数的签名(仅保留它们的名称)。 FWIW,C++ 但不是 C 使用 name mangling在名称中编码函数的签名。

正确的方法是在一些常见的 myheader.h 中声明 func 的正确签名,并在 #include 中声明该 header file1.cfile2.c(然后带有不兼容签名的 func 的定义将给出诊断消息)。

顺便说一句,如果您使用 gcc -flto -Wall -g 编译并链接(至少使用最新的 GCC,例如最新的 GCC 4.9),即使用链接时优化,几乎所有警告,以及调试信息,您可能已经收到了一些警告。

你的 GCC 4.6 已经很旧了,你应该考虑升级它。

关于extern 函数的 C 声明没有发出关于 #args 不匹配的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24860117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com