【发布时间】:2013-04-16 13:53:55
【问题描述】:
我有两个 .c 文件:A1.c 和 A2.c
A1.c如下:
int i=0;
void main()
{}
A2.c如下:
int i=0;
void func()
{}
它编译得很好,但是当我尝试链接这两个 .o 文件时,出现“i 的多重定义”错误。
我知道i 在这里是一个全局变量,但它不需要extern 关键字才能在其他文件中使用。在我的项目中,我没有使用extern。那我怎么会报错呢?
【问题讨论】:
-
"它需要一个extern关键字才能在其他文件中使用"--嗯,亨利,全局变量的默认存储类是“extern”。所以你不需要在A1中提及.c.但是您在 A2.c 中使用它,因为这表示该变量的定义在另一个文件中,即 A1.c。
-
@SheerFish 我了解到 extern 是函数的默认值,而不是全局变量。
-
全局变量默认有extern存储类。这里有一个StackOverflow链接,已经详细解释了stackoverflow.com/questions/4239834/…
-
我的意思是,对于函数和全局变量都是如此,而不仅仅是函数。引用 C99 标准“5) 如果函数标识符的声明没有存储类说明符, 它的链接被完全确定,就好像它是使用存储类说明符 extern 声明的。如果对象标识符的声明具有文件范围且没有存储类说明符,则它的链接是外部的。"
标签: c linker global-variables