2016-05-14 97 views
2

下面的C代碼:聯盟零初始化鏗鏘VS GCC

union Test { 
    struct { 
    int f1; 
    int f2; 
    }; 

    struct { 
    int f3; 
    int f4; 
    int f5; 
    }; 
}; 

union Test test = {.f1 = 1, .f2 = 2}; 

當我編譯這個用gcc 6.1.1 f5將初始化爲零。當我使用叮噹3.8.0時,它不是。我試着用-O0-O2這兩個編譯器都沒有什麼區別。這是在Linux x64上。

這是正確的行爲,我可以告訴clang在這種情況下行爲像gcc?原因是我嘗試用clang編譯一些代碼,在這種情況下假定爲零初始化。

更新

由於答案爲止舉C11。標準中是否有改變後續版本行爲的變化?

回答

5

C11指定在節6.2.6.1.7:

當值被存儲在聯合類型的對象的一員,該目的 表示的字節不對應於該成員但確實對應於其他成員 採取未指定的值。

您通過第一個結構訪問聯合,訪問第二個結構的成員可以產生未指定的值,所以clang並不是錯誤的,也不是gcc。


更新:在C11中添加了匿名成員。指定inits出現在C99。

+0

在初始化的情況下,對此也有任何參考? –

+0

我更新了這個問題:這個可能在C11中改變了,gcc默認的是另一個標準而不是clang? –

+2

@SouravGhosh:初始化正在存儲一個值。實際上,在第6.7.9.9節中: >除非另有明確規定,否則就本小節而言,結構體和聯合體類型的未命名成員不參與初始化。即使在初始化之後,結構對象的未命名成員也具有不確定的值。 – Picodev