C 链接器没有';我看不出有什么错误,奇怪
假设我有两个C src文件,A1.C、A2.C,内容如下: A1.C A2.CC 链接器没有';我看不出有什么错误,奇怪,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
链接器没有给我任何错误,尽管缺少“外部”安全词。我有两个相同的符号。有人能解释一下原因吗?对于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; }