我使用了具有这样结构的位字段
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结合使用是否有效?
答案 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;
};
};