当我们声明一个全局变量时,它被初始化为其默认值。但是,当我们使用extern
关键字初始化变量时,为什么变量会保留使用extern
关键字初始化的值?
例如,在下面的代码中,为什么输出9
而不是编译时错误?由于变量x
与任何其他源文件没有外部链接,因此x有两个副本,我们将变量初始化两次,因此这应该是一个错误。请澄清一下;我对这段代码的流程感到有点困惑。
#include <stdio.h>
extern int x=9;
int x;
int main()
{
printf("%d",x);
return 0;
}
答案 0 :(得分:1)
extern int x = 9;
表示与int x = 9;
相同。 extern
关键字对已具有外部链接和初始化程序的定义无效。
int x;
被称为暂定定义。
C11 6.9.2 / 2对此进行了详细描述:
具有没有初始化程序的文件范围的对象的标识符声明,以及 没有存储类说明符或存储类说明符静态,构成一个 暂定的定义。如果翻译单元包含一个或多个临时定义 然后,标识符和转换单元不包含该标识符的外部定义 行为就像翻译单元包含该文件范围声明一样 标识符,具有复制类型,如翻译单元的末尾,带有初始化程序 等于0。
此翻译单元 包含x
的外部定义,因此暂定定义无效。外部定义是在临时定义之前还是之后无关紧要。
“外部定义”是指文件范围内的非暂定定义 - 不要与extern
或“外部链接”混淆,尽管在您的示例中x
确实碰巧有外部链接。
所以你的代码完全相同:
int x = 9;