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

Ale*_*ßen 2 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};
Run Code Online (Sandbox Code Playgroud)

当我使用gcc 6.1.1编译它时f5将初始化为零.当我使用clang 3.8.0时,它不是.我试过-O0-O2两个没有任何区别的编译器.这是在Linux x64上.

这是正确的行为,我可以告诉clang在这种情况下表现得像gcc吗?原因是我尝试使用clang编译一些代码,在这种情况下假设零初始化.

更新

由于答案到目前为止引用了C11.标准中是否有任何更改会更改以后版本中的行为?

Pic*_*dev 5

C11在6.2.6.1.7节中规定:

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

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


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

  • @SouravGhosh:初始化是存储一个值.实际上,在第6.7.9.9节中:>除非另有明确说明,否则为了本子条款的目的,结构和联合类型的对象的未命名成员不参与初始化.即使在初始化之后,未命名的结构对象成员也具有不确定的值. (2认同)