1

我正在查看一个特定的代码片段,其中函数被声明为

int fn_xyz()

但是在另一个 .c 文件中引用该函数时,它被定义为:

extern void fn_xyz()

调用 fn_xyz 时,不检查返回值;GCC-4.7.0 从未对上述不匹配发出警告;这是预期的吗?

4

2 回答 2

3

每个源文件(从技术上讲,每个翻译单元)都是完全独立于其他文件编译的。所以编译器永远不会知道你在多个地方声明了同一个符号。在链接时,所有类型信息都已被删除,因此链接器也不能抱怨。

这正是您应该在所有源文件都包含的头文件中声明函数的原因。这样,类型不匹配触发编译器警告/错误。

于 2013-06-06T14:32:29.767 回答
0

由于链接阶段发生在编译之后(并且编译器不知道或不关心您链接到的位置;例如链接到共享库),因此编译器不需要进行这样的测试是有道理的。

于 2013-06-06T14:32:13.707 回答