0
我知道一個初始化變量是一個定義,不管它是否是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將其視爲警告而不是錯誤,並且可以進行編譯。
他們都是錯誤的。 –
也會首先拋出錯誤:http://coliru.stacked-crooked.com/a/99912d81a14f3a04 – pergy
在C語言中你有一個[Tentative definition](http://stackoverflow.com/questions/3095861/about-tentative -定義)。爲了兼容性的原因,編譯器可能會允許C++很好。 –