【问题标题】:Union Zero Initialization with clang vs gcc使用 clang 与 gcc 进行联合零初始化
【发布时间】:2016-05-14 21:55:17
【问题描述】:

给定以下 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。标准中是否有任何更改会改变后续版本中的行为?

【问题讨论】:

    标签: c gcc initialization clang unions


    【解决方案1】:

    C11 在第 6.2.6.1.7 节中指定:

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

    你通过第一个结构访问联合,访问第二个结构的成员可以产生未指定的值,所以clang没有错,gcc也没有。


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

    【讨论】:

    • 在初始化的情况下是否有任何参考?
    • 我更新了这个问题:C11 中是否可能发生了变化,并且 gcc 默认为不同于 clang 的其他标准?
    • @SouravGhosh :初始化正在存储一个值。事实上,在第 6.7.9.9 节: >除非另有明确说明,就本子条款而言,结构和联合类型对象的未命名成员不参与初始化。即使在初始化之后,结构对象的未命名成员也具有不确定的值。
    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 2016-12-10
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多