位域可以联合使用吗?
4 回答
是的,他们可以。为什么不?联合中的位域的行为方式与它们在其他任何地方的行为方式相同。联合中的位域(或带有位域的联合)没有什么特别之处。
是的,这是可能的,但我建议不要这样做。位域的长度和打包是不可移植的。工会的规模将难以预测(见此处)。当您使用联合或位域时,您会在代码中引入一定程度的复杂性。虽然这种复杂性在您的代码中可能是可以接受的,但将两者结合起来可能会导致无法接受的复杂性。如果您使用联合、结构和位域,则会遇到内存对齐问题。
如果这是只需要在一台机器上构建和运行的一次性代码,那么它可能没问题。但是,如果您将此检查到版本控制中,它将永远存在,我建议您不要这样做。
如果您举例说明为什么要这样做,我或其他人可以提出更好的选择。
编辑:根据评论进行澄清并征求反馈意见。
如果你想想工会是如何运作的,你就会得到答案,当然是肯定的(为什么不)?正如我们预期的那样,联合大到足以容纳最大的基准,因此自然而然地就更小了。位域被打包到“容器”中,编译器必须能够评估它们的最终实际大小。下面显示了一些有趣的事实(当然是错误的联合使用,但不是因为位域的存在!)
#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);
}
仅当您写入一个联合元素并从另一个联合元素中读取时,这才是不安全的。如果您的实现细节确保不会发生这种情况,那么包含 bitfied(可能还有其他成员)的联合具有定义明确的安全行为。