给出类似的内容(改编自another post):
struct {
union {
struct {
float x, y, z;
};
float xyz[3];
};
int a;
} v = { /* what goes here? */ };
如何将其初始化?我知道我必须为xyz
成员使用指定的初始化程序,但如果我想要第一组成员,我是否必须这样做?
...
看yet another post,它的例子只涉及匿名结构,而不是联合,但我猜语法是
//...
} v = { someX, someY, someZ, someA };
初始化union的第一个变体的三个成员,然后是整个union部分后面的int
。这是对的吗?
答案 0 :(得分:2)
匿名结构首次出现在C11标准中。
6.7.2.1.13陈述:
匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则递归应用。
考虑6.7.8节中的示例,您有多种选择,包括非常详细的选择:
struct {
union {
struct {
float x, y, z;
};
float xyz[3];
};
int a;
} v = { .x = 1.0f, .y = 2.0f, .z = 3.0f, 2 };
或
struct {
union {
struct {
float x, y, z;
};
float xyz[3];
};
int a;
} v = { .xyz[0] = 1.0f, .xyz[1] = 2.0f, .xyz[2] = 3.0f, .a = 2 };
您使用普通{1.0f, 2.0f, 3.0f, 4}
的变体会在Wall打开时发出警告warning: missing braces around initializer
,v = { {1.0, 2.0, 3.0}, 2 }
也是如此。所以我建议添加明确的字段描述。
我在gcc 4.8.1上测试了这些初始化,并打开了--std = c11 -Wall -pedantic。
答案 1 :(得分:1)
struct A{
union B{
struct C {
float x, y, z;
} S;
float xyz[3];
} U;
int a;
};
int main ()
{
struct A v = { .U.S.x = 0.0f, .U.S.y = 123.234f, .U.S.z= 123.3f };
struct A w = { .U.xyz = {0.0f, 123.234f, 123.3f} };
printf("\n %f %f %f \n ",v.U.S.x, v.U.S.y ,v.U.S.z);
}