用clang vs gcc进行联合零初始化

亚历山大·西森(AlexanderTheißen)

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

Picodev

C11在6.2.6.1.7节中指定:

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

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


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用clang vs gcc进行联合零初始化

来自分类Dev

这是GCC错误吗?用联合初始化结构

来自分类Dev

为什么clang和gcc用类内初始化对结构的支撑初始化进行不同的处理?

来自分类Dev

Clang vs GCC vs MSVC-使用括号括起来的初始化列表创建用户定义的类型?

来自分类Dev

在类中嵌套静态const成员变量初始化Clang vs GCC哪个编译器正确?

来自分类Dev

用联合返回结构的初始化

来自分类Dev

用名称vs变量初始化对象

来自分类Dev

为什么Clang和VS2013接受移动括号初始化的默认参数,但不接受GCC 4.8或4.9?

来自分类Dev

用嵌套结构初始化联合

来自分类Dev

用clang而不是gcc编译

来自分类Dev

用001 vs 1初始化int有区别吗?

来自分类Dev

用零初始化ArrayList <Integer>的值-Java

来自分类Dev

用零初始化ArrayList <Integer>的值-Java

来自分类Dev

用零初始化malloc而不是使用calloc

来自分类Dev

是否保证零初始化的std :: atomic <T *>等同于用nullptr初始化的零?

来自分类Dev

用gcc或clang自动生成头文件

来自分类Dev

用Clang初始化结构的std :: array的编译器错误

来自分类Dev

用C进行数组初始化

来自分类Dev

Eager 初始化 vs Lazy 初始化用例

来自分类Dev

初始化char * vs int *

来自分类Dev

Swift vs ObjC初始化过程?

来自分类Dev

{} vs.()类成员的初始化

来自分类Dev

int * vs char *初始化

来自分类Dev

defaultdict vs dict元素初始化

来自分类Dev

VS初始化灵活数组C ++

来自分类Dev

Visual C ++初始化与gcc和clang不一致

来自分类Dev

初始化double时,请指定float。gcc和clang不同

来自分类Dev

用clang中用大括号括起来的列表初始化的char数组中的尾随符号是什么?

来自分类Dev

clang vs gcc-优化包括运算符new

Related 相关文章

热门标签

归档