Can';外部';在使用全局变量时是否省略?

Can';外部';在使用全局变量时是否省略?,c,compilation,extern,C,Compilation,Extern,最近我在C中发现了一个关于“extern”的奇怪东西 当我使用gcc tmp.c tmp2.c-o tmp-Wall编译它时,结果非常好,没有编译错误(也没有警告!)。输出为1。但是以下代码不会通过链接过程(唯一的区别是我在第二个文件中初始化了tmp): 编译器似乎将任何未初始化的变量视为外部变量?int x=value是x的定义。将其中两个放在文件范围会创建多个定义,从而导致链接错误 intx是一个暂定定义。根据C标准,在同一翻译单元(正在编译的源文件,包括所有包含的文件)中没有常规定义的

最近我在C中发现了一个关于“extern”的奇怪东西

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


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

int x=value
x
的定义。将其中两个放在文件范围会创建多个定义,从而导致链接错误

intx是一个暂定定义。根据C标准,在同一翻译单元(正在编译的源文件,包括所有包含的文件)中没有常规定义的情况下,它将用作定义


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

将代码作为文本粘贴到问题中,不是图像。此行为在gcc-10中已改变: