C是否支持工会的匿名成员?

时间:2018-09-21 14:48:54

标签: c

我有一个并集,它是数组在三个浮点数上的叠加层:

union {
    float currents[3];
    struct {
        float run;
        float standby;
        float sleep;
    };
} MyCurrents;

run可以通过MyCurrents.runMyCurrents.currents[0]访问。

有没有一种方法可以使currents匿名,这样我可以通过使用run来访问MyCurrents[0]?在此用例中,拥有.访问器似乎有些多余。

我意识到我可以使用((float*)&MyCurrents)[0],但这太可怕了,我不确定这是否是可靠的使用方法。

1 个答案:

答案 0 :(得分:3)

根据C标准,结构或联合的成员可能是匿名的。之所以可行,是因为其中的成员不是匿名的,因此封闭结构或联合中的每个子对象都有一个名称。不支持其他类型的匿名成员(用于填充的位字段可以是匿名的,但通常也无法访问)。

(C语法允许您包含不带名称的声明(C 2018 6.7.2.1 1: struct-declarator-list struct-declaration 中是可选的) ,但是它们不会创建成员,因此无法引用它们。声明一个没有名称的成员需要省略语法的整个声明符,其中包括(根据6.7。1) *代表指针,[]代表数组,()代表函数,因此语法允许您声明struct { float; float f; } foo;但不是struct { float [3]; float f; } foo;。)