当已经将extern关键字声明为全局变量时,使用extern关键字初始化变量时,存储在变量中的值是多少?

时间:2017-02-27 20:00:38

标签: c

当我们声明一个全局变量时,它被初始化为其默认值。但是,当我们使用extern关键字初始化变量时,为什么变量会保留使用extern关键字初始化的值?

例如,在下面的代码中,为什么输出9而不是编译时错误?由于变量x与任何其他源文件没有外部链接,因此x有两个副本,我们将变量初始化两次,因此这应该是一个错误。请澄清一下;我对这段代码的流程感到有点困惑。

#include <stdio.h>

extern int x=9;
int x;

int main()
{
    printf("%d",x);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

extern int x = 9;表示与int x = 9;相同。 extern关键字对已具有外部链接和初始化程序的定义无效。

int x;被称为暂定定义

C11 6.9.2 / 2对此进行了详细描述:

  

具有没有初始化程序的文件范围的对象的标识符声明,以及   没有存储类说明符或存储类说明符静态,构成一个   暂定的定义。如果翻译单元包含一个或多个临时定义   然后,标识符和转换单元不包含该标识符的外部定义   行为就像翻译单元包含该文件范围声明一样   标识符,具有复制类型,如翻译单元的末尾,带有初始化程序   等于0。

此翻译单元 包含x的外部定义,因此暂定定义无效。外部定义是在临时定义之前还是之后无关紧要。

“外部定义”是指文件范围内的非暂定定义 - 不要与extern或“外部链接”混淆,尽管在您的示例中x确实碰巧有外部链接。

所以你的代码完全相同:

int x = 9;