联盟零初始化铿锵VS GCC

问题描述:

下面的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。标准中是否有改变后续版本行为的变化?

C11指定在节6.2.6.1.7:

当值被存储在联合类型的对象的一员,该目的 表示的字节不对应于该成员但确实对应于其他成员 采取未指定的值。

您通过第一个结构访问联合,访问第二个结构的成员可以产生未指定的值,所以clang并不是错误的,也不是gcc。


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

+0

在初始化的情况下,对此也有任何参考? –

+0

我更新了这个问题:这个可能在C11中改变了,gcc默认的是另一个标准而不是clang? –

+2

@SouravGhosh:初始化正在存储一个值。实际上,在第6.7.9.9节中: >除非另有明确规定,否则就本小节而言,结构体和联合体类型的未命名成员不参与初始化。即使在初始化之后,结构对象的未命名成员也具有不确定的值。 – Picodev