它是有效的使用位字段与工会?(Is it valid to use bit fields with

2019-06-26 00:55发布

我已经使用位域这样的结构,

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

现在我想看看这是否可以为联合完成,所以我修改了代码一样,

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

我发现与工会工作的位字段,但在联盟所有这些领域都给予单个位,因为我从输出的理解。 现在我看到它是不是错误使用位字段与工会,但在我看来,使用它像这样不正确的操作上。 所以,答案是什么 - 它是有效使用位域与工会?

Answer 1:

给你一个枪和子弹。 是否接受这个拍你的自我足? 当然不是,但没有人可以这样做,如果你想阻止你。

我的观点是,就像枪和子弹,工会和位字段的工具,他们有他们的目的,用途和“滥用”。 因此,使用位域工会,正如你上面写的,是完全合法的C,但毫无用处的代码。 所有联盟共享相同的内存里面,这样所有的位域你提到的领域基本上是相同的标志,因为它们共享相同的内存。



Answer 2:

它是有效的,但是当你发现了,没有用的,你做它的方式出现。

你可能会做这样的事情,所以你可以将所有在同一时间使用标志位。

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;
    };
};


文章来源: Is it valid to use bit fields with union?