【发布时间】:2013-02-22 14:03:18
【问题描述】:
我确定我快疯了,但请考虑以下 C 代码:
// file1.c
int first;
void f(void)
{ first = 2; }
// file2.c
#include <stdio.h>
int first;
void f();
int main(void)
{
first = 1;
f();
printf("%d", first);
}
这两个文件,出于某种原因将编译并链接在一起,并打印2。我一直觉得除非我用extern 标记first 的一个或另一个(但不是两个)定义,否则这不会编译,而这实际上是extern 的全部意义!
【问题讨论】:
-
当您将函数声明为外部时,链接器将在另一个对象中搜索它。否则它将在同一个文件中查找它。
-
这甚至不应该链接。您确定要显示所有编译器和链接器警告吗?
-
@KerrekSB 与 GCC 完美链接。从
f和main打印&first会产生相同的地址。 -
@larsmans:是的。有趣的。所以变量只是“暂时定义”,除非它被初始化?
-
是的,这太疯狂了。我想知道它是否是 gcc/linux 链接器优化。我敢肯定这过去不工作(“过去工作”可能是几年前。也许我应该在 VM 中安装一个旧的 linux,只是为了进行健全性检查?)
标签: c compilation linker extern