联合零初始化与 clang vs gcc
Union Zero Initialization with clang vs gcc
给定以下 C 代码:
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
将被零初始化。当我使用 clang 3.8.0 时,它不是。我为两个编译器尝试了 -O0
和 -O2
,但没有任何区别。这是在 Linux x64 上。
哪种行为是正确的,我可以让 clang 在这种情况下表现得像 gcc 吗?原因是我尝试用 clang 编译一些代码,在这种情况下假定零初始化。
更新
目前答案引用C11。标准中是否有任何更改更改了更高版本中的行为?
C11 在第 6.2.6.1.7 节指定:
When a value is stored in a member of an object of union type, the bytes of the object
representation that do not correspond to that member but do correspond to other members
take unspecified values.
您通过第一个结构访问联合,访问第二个结构的成员可能会产生未指定的值,因此 clang 没有错,gcc 也没有错。
更新:在 C11 中添加了匿名成员。指定inits出现在C99.
给定以下 C 代码:
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
将被零初始化。当我使用 clang 3.8.0 时,它不是。我为两个编译器尝试了 -O0
和 -O2
,但没有任何区别。这是在 Linux x64 上。
哪种行为是正确的,我可以让 clang 在这种情况下表现得像 gcc 吗?原因是我尝试用 clang 编译一些代码,在这种情况下假定零初始化。
更新
目前答案引用C11。标准中是否有任何更改更改了更高版本中的行为?
C11 在第 6.2.6.1.7 节指定:
When a value is stored in a member of an object of union type, the bytes of the object representation that do not correspond to that member but do correspond to other members take unspecified values.
您通过第一个结构访问联合,访问第二个结构的成员可能会产生未指定的值,因此 clang 没有错,gcc 也没有错。
更新:在 C11 中添加了匿名成员。指定inits出现在C99.