使用clang vs gcc进行Union Zero初始化

时间:2016-05-14 12:46:11

标签: c gcc initialization clang unions

给出以下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。是否有标准中的更改改变了更高版本的行为?

1 个答案:

答案 0 :(得分:5)

C11在6.2.6.1.7节中指定:

  

当值存储在union类型的对象的成员中时,该对象的字节数   表示与该成员不对应但与其他成员对应的表示   取未指定的值。

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

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