使用带有联合的位字段是否有效?

时间:2012-07-04 09:41:28

标签: c structure bit-fields unions

我使用了具有这样结构的位字段

struct
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;

现在我想知道是否可以使用union来完成,所以我修改了代码,如

union
{
       unsigned int is_static: 1;
       unsigned int is_extern: 1;
       unsigned int is_auto: 1;
} flags;

我找到了带有union的位字段,但是从输出中可以理解,并集中的所有字段都被赋予了一个位。现在我看到使用带有union的位字段并不是错误的,但在我看来,像这样使用它在操作上是不正确的。那么答案是什么 - 将字段与union结合使用是否有效?

2 个答案:

答案 0 :(得分:18)

你有枪和子弹。用脚射击自己可以吗?当然不是,但如果你愿意,没有人可以阻止你这样做。

我的观点是,就像枪支和子弹一样,联合和位域是工具,它们的目的,用途和“滥用”。因此,如上所述,使用联合中的位域是完全有效的C,但却是无用的代码。 union中的所有字段共享相同的内存,因此你提到的所有位域都是相同的标志,因为它们共享相同的内存。

答案 1 :(得分:17)

这是有效的,但正如你所发现的那样,在那里做的方式没有用。

你可能会这样做,所以你可以使用标志同时重置所有位。

union {
    struct {
        unsigned int is_static: 1;
        unsigned int is_extern: 1;
        unsigned int is_auto: 1;
    };
    unsigned int flags;
};

或者您可能会这样做:

union {
    struct {
        unsigned int is_static: 1;
        unsigned int is_extern: 1;
        unsigned int is_auto: 1;
    };
    struct {
        unsigned int is_ready: 1;
        unsigned int is_done: 1;
        unsigned int is_waiting: 1;
    };
};