c联合和位域

div*_*vya 9 c unions bit-fields

可以在联合中使用位域吗?

AnT*_*AnT 8

是的,他们可以.为什么不?联合中的位字段的行为方式与它们在其他任何位置的行为方式相同.联合中的位字段(或具有位字段的联合)没有什么特别之处.


Ben*_*ner 3

是的,这是可能的,但我建议不要这样做。位域的长度和打包是不可移植的。联合体的规模很难预测(参见此处)。使用联合或位域时会给代码带来一定程度的复杂性。虽然这种复杂性在您的代码中可能是可以接受的,但将两者结合起来可能会导致不可接受的复杂性。如果您使用联合、结构和位域,则会遇到内存对齐问题。

如果这是只需要在一台机器上构建和运行的一次性代码,那么它可能没问题。但是,如果您将其检查到版本控制中,它将永远存在,我建议您不要这样做。

如果您举例说明为什么要这样做,我或其他人可以提出更好的选择。

编辑:根据评论进行澄清并寻求反馈。

  • 与一般的位字段相比,联合中的位字段有什么不可移植的地方?具体来说,什么是难以预测的? (3认同)
  • 您链接的帖子中的抱怨是关于包含位字段的联合的 sizeof() ,而不是行为。结构大小始终依赖于实现,与位域无关。还有人抱怨无法获取位域成员的地址,但这就是位域的工作方式,与联盟无关。 (3认同)