给出以下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节中指定:
当值存储在联合类型的对象的成员中时,与该成员不对应但与其他成员对应的对象表示形式的字节采用未指定的值。
您通过第一个结构访问联合,访问第二个结构的成员可以生成未指定的值,因此clang也不是错误,gcc也不是。
更新:在C11中添加了匿名成员。指定的init出现在C99中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句