我知道初始化变量是一个定义,无论它是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将其视为警告而非错误,并且可以编译。
答案 0 :(得分:0)
首先,你的两个片段都是格式错误 - 请使用现代编译器来试用它们。
在全局范围中声明变量时,它会自动进行零初始化。这就是您获得重新定义错误的原因 - x
已定义为零。
以下代码段将编译:
extern int x;
int x;
int main()
{
}