2017-02-27 51 views
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將其視爲警告而不是錯誤,並且可以進行編譯。

+0

他們都是錯誤的。 –

+0

也會首先拋出錯誤:http://coliru.stacked-crooked.com/a/99912d81a14f3a04 – pergy

+0

在C語言中你有一個[Tentative definition](http://stackoverflow.com/questions/3095861/about-tentative -定義)。爲了兼容性的原因,編譯器可能會允許C++很好。 –

回答

0

首先,你的代碼片段都不合格 - 請使用現代編譯器來試用它們。

全局範圍聲明變量,它是自動初始化爲零。這就是你得到重新定義的原因錯誤 - x已被定義爲零。

下面的代碼片段將編譯:

extern int x; 
int x; 
int main() 
{ 
} 
相關問題