可以在联合中使用位域吗?
答案 0 :(得分:8)
是的,他们可以。为什么不?联合中的位字段的行为方式与它们在其他任何位置的行为方式相同。联合中的位字段(或具有位字段的联合)没有什么特别之处。
答案 1 :(得分:2)
是的,这是可能的,但我建议不要这样做。位域的长度和打包不可移植。联盟的规模很难预测(见here)。当您使用联合或位域时,您会在代码中引入一定的复杂性。虽然您的代码可能会接受这种复杂性,但将这两者结合起来可能会导致难以接受的复杂程度。如果您正在使用联合,结构和位域,则会遇到内存对齐问题。
如果这只是一次性代码,只需要在一台机器上构建和运行,那么它可能就好了。但是,如果你将它检查到版本控制中它将永远存在,我建议不要使用它。
如果您举例说明您为什么要这样做,我或其他人可以提出更好的选择。
编辑:根据评论澄清并征求反馈意见。
答案 2 :(得分:2)
如果你考虑工会是如何运作的,你有答案,当然是(为什么不)?正如我们所期望的那样,联盟足够大,可以保持最大的数据,因此自动变小。位域被打包到“容器”中,编译器必须能够评估它们的最终实际大小。以下显示了一些有趣的事实(当然是联盟的错误用法,但不适用于位域存在!)
#include <stdio.h>
union test {
int a:5;
int b:12;
float c;
double d;
int x;
};
int main()
{
union test x;
printf("%d\n", sizeof(x));
x.a = 31;
printf("%d\n", x.a);
printf("%d\n", x.b);
x.c = 1.23;
printf("%d\n", x.a);
printf("%f\n", x.c);
x.x = 31;
printf("%d\n", x.x);
printf("%d\n", x.a);
printf("%d\n", x.b);
}
答案 3 :(得分:0)
如果你写一个联合元素并从另一个联合元素中读取它,那是唯一不安全的。如果您的实现细节确保不会发生,那么包含一个苦涩的(并且可能是其他成员)的联盟具有明确定义的安全行为。