我正在审核一个特定的代码段,其中函数声明为
int fn_xyz()
但在引用另一个.c文件中的函数时,它被定义为:
extern void fn_xyz()
当调用fn_xyz时,不检查返回值; GCC-4.7.0从未就上述不匹配发出警告;这是预期的吗?
答案 0 :(得分:3)
每个源文件(技术上,每个翻译单元)完全独立于其他源文件进行编译。所以编译器永远不会知道你在多个地方声明了相同的符号。在链接时,所有类型信息都已被删除,因此链接器也不会抱怨。
这正是您应该在所有源文件包含的标头中声明函数的原因。这样,类型不匹配将触发编译器警告/错误。
答案 1 :(得分:0)
由于链接阶段发生在编译之后(并且编译器不知道或不关心链接到哪里;比如链接到共享库),因此编译器不会期望这样的测试。