使用全局变量时可以省略'extern'吗?

Can 'extern' be omitted when using global variables?

最近在C

中发现了一个关于'extern'的怪事

当我使用 gcc tmp.c tmp2.c -o tmp -Wall 编译它时,结果非常好,没有编译错误(也没有警告!)。输出是 1。但是下面的代码不会通过链接过程(唯一不同的是我在第二个文件中初始化了tmp):

似乎编译器将任何未初始化的变量都视为外部变量?

int x = value;x 的定义。在文件范围内设置其中两个会创建多个定义,从而导致 link 错误。

int x; 在文件范围内是暂定定义。根据 C 标准,在同一翻译单元(正在编译的源文件,包括所有包含的文件)中没有常规定义的情况下,它作为定义。

当在一个翻译单元中提供定义而在另一个翻译单元中提供同一标识符的暂定定义时,C 标准未定义行为,但 Unix 工具通常允许合并暂定定义,允许 link 完成。