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

我使用了像这样的结构的bit字段,

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; 

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

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

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

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

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

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