繁体   English   中英

没有为多个定义生成编译器警告

[英]Compiler warning not generated for multiple definitions

我面临的问题是在两个.c文件中定义了具有相同签名的函数,并且没有给出编译时错误。 我已经在.h文件中包含了声明,这两个.c文件中都包含了声明。

例如:

int add(int x, int y) { return x+y;}

在两个.c文件(说Ac和Bc)中给出了相同的定义,并在一个包含在Ac和Bc中的.h文件中进行了声明,但是为什么这没有给出编译时错误,或者如何使它们出现编译错误?

连Linker都没有给出任何错误,它看起来像是第一个定义

我正在使用GCC编译器mingw

我发现了另一个模式。 如果我在头文件中使用它

#ifndef H_H_
#define H_H_

链接器未给出警告警告,但如果我不使用此链接器,则将给出警告。

编译器不会整体分析您的程序。 它一次只处理一个.c文件。 如果.h文件中的声明与.c文件中的定义匹配,则就编译器而言,一切都很好。

链接器将检测到该函数已定义两次,并将生成“重复符号”错误。

编译器看到每个源文件彼此分开。 编译器将头文件的内容包含到Ac中,然后从AcAobj文件生成一个目标文件A.obj,其中将包含Ac中定义的变量和函数的符号。另一方面,编译器将对Bc进行分开处理,而无需检查Ac,或者其他源文件,内容。 首先将头文件包含到Bc中,然后生成B.obj,其中还包含Bc中定义的变量和函数的符号

结果,由于编译器未检测到函数重复,因此在编译时不会出现错误。 链接器工作是检查符号一致性以及是否存在重复项。 链接器将获取所有生成的目标文件,以生成可执行文件。 链接器必须为每个符号分配一个唯一的内存地址。 例如,在您的代码中,如果确实有一个点(比如说在主要函数中)调用了Ac的函数,那么实际上这会转换为对该函数所在的内存地址的跳转。 现在,假设在可执行文件中是否存在两个具有相同签名的函数,并且每个符号具有不同的地址。 然后,处理器如何确定您打算在程序中确切调用哪个函数。 因此,如果链接器发现重复的符号,则将发出错误信号。

这种情况是不确定的行为,不需要诊断。

请查阅链接器的文档,以查看它是否具有报告多个功能定义的选项。

正如@ Matt-McNabb所说:请查阅链接器文档。

我唯一能想到的其他原因是链接程序二进制文件比较了两个函数,发现它们是同义的,而忽略了一个。 您可以通过稍微更改代码来进行检查,例如通过“返回y + x”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM