带初始化的外部变量真的是一个定义吗?

时间:2017-02-27 12:19:07

标签: c++

我知道初始化变量是一个定义,无论它是extern。但是,由于extern int x=1;是一个定义,为什么编译器不会运行以下代码时抛出重定义错误?

//ok,no error
int x;
extern int x=1;
int main()
{
}

//however,this is an error
extern int x=1;
int x;
int main()
{
}

为什么会发生这种情况?有什么不同吗?

更新:你是对的。当我使用VS 2013进行编译时,没有错误。现在我在linux上尝试使用gcc并且正如我预期的那样得到了重新定义错误。

正如@Bo Persson所说,这完全是关于C中的暂定定义。当我将文件后缀更改为.c时,gcc将其视为警告而非错误,并且可以编译。

1 个答案:

答案 0 :(得分:0)

首先,你的两个片段都是格式错误 - 请使用现代编译器来试用它们。

全局范围中声明变量时,它会自动进行零初始化。这就是您获得重新定义错误的原因 - x已定义为零。

以下代码段将编译:

extern int x;
int x;
int main()
{
}