假设我有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个相同的符号。有谁可以解释为什么?
答案 0 :(得分:2)
对于gcc,您可以使用-fno-common
标志将其转换为错误。
gcc文档解释了发生了什么
-fno-common
在C代码中,控制未初始化的全局变量的放置。 Unix C编译器传统上允许多个 不同编译单位中此类变量的定义 将变量放在公共块中。这是行为 由-fcommon指定,并且是大多数目标上GCC的默认值。
在 另一方面,ISO C并不需要这种行为 目标可能会对变量引用带来速度或代码大小的惩罚。
-fno-common选项指定编译器应该放置 目标文件的数据部分中未初始化的全局变量, 而不是将它们生成为公共块。这有效果 如果在两个不同的情况下声明相同的变量(没有extern) 编译时,链接它们时会出现多重定义错误。