c联合和位域

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

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

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

如果这是一次性代码,只需要在一台机器上构建和运行,那么它可能就好了。 但是,如果您将其检入版本控制,它将永远存在,我建议不要使用它。

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

编辑:根据评论澄清并征求反馈意见。

如果你考虑工会是如何运作的,你有答案,当然是(为什么不)? 正如我们所期望的那样,联盟足够大,可以保持最大的数据,因此自动更小。 位域被打包到“容器”中,编译器必须能够评估它们的最终实际大小。 以下显示了一些有趣的事实(当然是一个错误的联合使用,但不适用于位域存在!)

#include  union test { int a:5; int b:12; float c; double d; int x; }; int main() { union test x; printf("%d\n", sizeof(x)); xa = 31; printf("%d\n", xa); printf("%d\n", xb); xc = 1.23; printf("%d\n", xa); printf("%f\n", xc); xx = 31; printf("%d\n", xx); printf("%d\n", xa); printf("%d\n", xb); } 

如果你写一个联合元素并从另一个联合元素读取它,这是不安全的。 如果您的实现细节确保不会发生,那么包含bitfied(以及可能是其他成员)的联合具有明确定义的安全行为。