我有以下问题:如何根据当前的C1X 草案正确初始化匿名结构(或联合) ?这是否合法:
struct foo {
int a;
struct {
int i;
int j;
};
int b;
};
struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
在 GCCg.j == 0
和g.b == 3
中,而在 tccg.j == 3
和g.b == 0
. 目前的草案说:
“[...] 结构和联合类型对象的未命名成员不参与初始化。结构对象的未命名成员即使在初始化之后也具有不确定的值。”。
这真的是真的吗?不是吗
struct foo h = { 0 };
应该将所有成员设置为0?
非常感谢!
更新:
由于匿名成员似乎只在混合结构/联合时才有用,如何正确初始化它:
struct bar {
int tag;
union {
double d;
int i;
};
};
? 这会在 gcc < 4.6 和 icc 11 中产生错误,但在 gcc 4.6、icc 12、clang 和 tcc 中有效:
struct bar a = { .tag = 1, .i = 42 };
这会在 clang 和 tcc 中产生错误,但在 gcc 和 icc 中有效:
struct bar b = { .tag = 1, { .i = 42 } };
第二个是否违反标准?