c联合和位域

时间:2010-06-21 17:47:33

标签: c bit-fields unions

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

4 个答案:

答案 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)

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