【发布时间】:2011-07-01 02:48:23
【问题描述】:
我有以下问题:如何根据当前的C1X draft 正确初始化匿名结构(或联合)?这合法吗:
struct foo {
int a;
struct {
int i;
int j;
};
int b;
};
struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
在 GCC 中,g.j == 0 和 g.b == 3,而在 tcc 中 g.j == 3 和 g.b == 0。目前的草案说:
“[...]结构和联合类型对象的未命名成员不参与初始化。结构对象的未命名成员即使在初始化后也具有不确定的值。”。
这真的是真的吗?不是
struct foo h = { 0 };
应该将 所有 成员设置为 0?
非常感谢!
更新:
由于匿名成员似乎只在混合结构/联合时才有用,如何正确初始化它:
struct bar {
int tag;
union {
double d;
int i;
};
};
?这会在 gcc
struct bar a = { .tag = 1, .i = 42 };
这会在 clang 和 tcc 中产生错误,但在 gcc 和 icc 中有效:
struct bar b = { .tag = 1, { .i = 42 } };
第二个是否违反标准?
【问题讨论】:
-
重新更新:如果我对标准的解释是正确的,那么第二个例子确实是违规的:在
.tag = 1之后,当前对象(参见 6.7.9 §17)将与匿名联合的第一个成员double d,不能用{ .i = 42 }初始化...
标签: c standards anonymous structure c11