Linker没有显示任何错误,很奇怪

时间:2014-06-28 22:45:17

标签: c linker static-linking extern linkage

假设我有2个C src文件,A1.C,A2.C,这些是内容:

A1.C

int x;
int main(){
     void f(void);

     x = 5; 
     f();
     printf("%d", x);

     return 0;
}

A2.C

int x;
void f() {  x = 4; }

尽管缺少" extern"链接器并没有给我任何错误。安全码。我有2个相同的符号。有谁可以解释为什么?

1 个答案:

答案 0 :(得分:2)

对于gcc,您可以使用-fno-common标志将其转换为错误。

gcc文档解释了发生了什么

  

-fno-common

     

在C代码中,控制未初始化的全局变量的放置。 Unix C编译器传统上允许多个   不同编译单位中此类变量的定义   将变量放在公共块中。这是行为   由-fcommon指定,并且是大多数目标上GCC的默认值。

     

在   另一方面,ISO C并不需要这种行为   目标可能会对变量引用带来速度或代码大小的惩罚。

     

-fno-common选项指定编译器应该放置   目标文件的数据部分中未初始化的全局变量,   而不是将它们生成为公共块。这有效果   如果在两个不同的情况下声明相同的变量(没有extern)   编译时,链接它们时会出现多重定义错误。

另见Tentative definitions in C99 and linking