联盟零初始化铿锵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。
在初始化的情况下,对此也有任何参考? –
我更新了这个问题:这个可能在C11中改变了,gcc默认的是另一个标准而不是clang? –
@SouravGhosh:初始化正在存储一个值。实际上,在第6.7.9.9节中: >除非另有明确规定,否则就本小节而言,结构体和联合体类型的未命名成员不参与初始化。即使在初始化之后,结构对象的未命名成员也具有不确定的值。 – Picodev