2013-01-17 70 views
4

我試過這三個小程序的版本,並且得到了一些有趣的結果。任何人都可以幫助我理解每種情況下的編譯器行爲。瞭解程序和GCC編譯器行爲中變量的多重聲明

version 1.0 

int A; 
int A; 
int A; 

int main() 
{ 
    return 0; 
} 

Result: Got compiled with one copy of A in BSS. 


Version 2.0 

int main() 
{ 
    int A; 
    int A; 
    int A; 

    return 0; 
} 

Result: Failed to compile with complaining for re-declaration. 


Version 3.0 

int A; 

int main() 
{ 
    static int A; 
    return0; 
} 

result: Compiled with two copy of A in BSS. one is A and another a.<some numeric tag>. 
+0

Satpal查看這兩個:[** 6.9.2外部對象定義**](http://c0x.coding-guidelines.com/6.9.2.html)和[**爲什麼變量不能是在C **中的兩個文件中定義兩次](http://stackoverflow.com/questions/4990315/why-a-variable-cant-be-defined-twice-in-2-files-in-c) –

回答

8

在你的第一個例子,是int A;暫定的定義:在文件範圍內的識別符的不具有初始值設定和或者沒有存儲類或static存儲類的聲明。你可以有多個的,他們都將指向同一個變量:

的標準說: (ISO/IEC 9899:1999 6.9.2)

爲一個對象標識符的聲明具有不帶初始值設定項的文件範圍,並且沒有存儲類說明符或靜態存儲類說明符構成暫定義。如果翻譯單元包含標識符的一個或多個試驗性定義,並且翻譯單元不包含該標識符的外部定義,則行爲就好像翻譯單元包含該標識符的文件範圍聲明一樣,複合類型爲的初始值等於0.

在第二個示例中,A不是文件範圍。這是一個局部變量,它不是一個試探性的定義,所以你只能有一個。

在第三個示例中,文件範圍內的A與main()中的A不同,因爲它們具有不同的範圍。僅僅因爲第二個A是靜態的不會改變它的範圍;該標識符仍然只能從main()內部看到。這是一種變量陰影的情況,其中一個作用域中的變量與封閉作用域中的變量具有相同的標識符(在本例中爲main()作用域與文件作用域)。文件範圍內的A事實恰好暫時的定義不會影響main()內部的A