如何在C中初始化匿名复合类型

时间:2014-01-30 07:20:42

标签: c initialization c11

给出类似的内容(改编自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。这是对的吗?

2 个答案:

答案 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 initializerv = { {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);
}