C 链接器没有';我看不出有什么错误,奇怪

C 链接器没有';我看不出有什么错误,奇怪,c,linker,static-linking,extern,linkage,C,Linker,Static Linking,Extern,Linkage,假设我有两个C src文件,A1.C、A2.C,内容如下: A1.C A2.C 链接器没有给我任何错误,尽管缺少“外部”安全词。我有两个相同的符号。有人能解释一下原因吗?对于gcc,您可以使用-fno common标志将其转换为错误 gcc文档解释了正在发生的事情 -fno common 在C代码中,控制未初始化全局变量的位置。Unix C编译器传统上允许多个 不同编译单元中此类变量的定义 将变量放置在公共块中。这就是行为 由-fcommon指定,是大多数目标上GCC的默认值 在 另一方面,IS

假设我有两个C src文件,A1.C、A2.C,内容如下:

A1.C

A2.C


链接器没有给我任何错误,尽管缺少“外部”安全词。我有两个相同的符号。有人能解释一下原因吗?

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

gcc文档解释了正在发生的事情

-fno common

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

在 另一方面,ISO C并不要求这种行为,在某些情况下 目标可能会对可变引用进行速度或代码大小惩罚

-fno公共选项指定编译器应该放置 对象文件的数据部分中未初始化的全局变量, 而不是将它们生成为公共块。其效果是 如果同一变量在两个不同的 编译时,链接它们时会出现多定义错误


另请参见

您是否尝试添加一些警告选项,如
-W
(用于GCC)等?我相信,如果没有extern,编译器将删除一个冗余的variables@apache不太可能。如果它像你说的那样发生,那么
extern
keywork就没用了。但是,编译器可能会将这两个变量视为<代码>静态< /代码>。更容易知道问题是否包含由这样一个代码生成的输出。@Unda:它们被声明为具有外部链接。不提供存储类说明符表示“外部链接”,而
extern
表示“已提供的链接,如果未提供,则为外部链接”。
int x;
int main(){
     void f(void);

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

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