2012-11-25 33 views
2

從部分(6.2.2/7)C99標準這是否會在C中調用未定義的行爲?

7.如果,一個翻譯單元內,相同的標識符與 出現內部和外部連接,該行爲是未定義。

雖然下面將產生一個編譯時錯誤由於定義

// 'x' has external linkage 
extern int x; 

// Here, 'x' has internal linkage 
static int x; 

衝突,但以下編譯罰款,

// 'x' has external linkage 
extern int x; 

void foo() { 
    // Here, 'x' has internal linkage 
    static int x; 
} 

一舉兩得的情況下調用一個未定義的行爲?

回答

3

你的問題源於一個不正確的假設,即一個本地聲明的靜態變量具有內部鏈接。實際上,在塊範圍中聲明的靜態變量具有無鏈接。見6.2.2/6

以下標識符沒有起重:聲明爲 標識符比對象或功能的其它任何東西;標識爲 的標識符是函數參數;在沒有存儲級說明符的情況下聲明的對象 的塊範圍標識符extern

只有文件範圍聲明可以有外部或內部鏈接(加上本地extern聲明)。

因此6.2.2/7和你的問題根本不適用。

+0

感謝您指出。我想這就是你複製和粘貼東西時發生的事情:S – user963241

1

據我所知,它沒有,因爲兩個變量是不一樣的。局部變量優先於全局變量,並且在foo()的範圍內,它只聲明一次。查看彙編程序輸出 - 編譯器很可能將這兩個變量轉換爲兩個不同的符號。

相關問題