我正在学习C.在 C Primer Plus 中,我看到了一个字段示例如下:
struct box_props {
bool opaque : 1;
unsigned int fill_color : 3;
unsigned int : 4;
bool show_border : 1;
unsigned int border_color : 3;
unsigned int border_style : 2;
unsigned int : 2;
};
我知道中间的4位未命名位字段用于让以下位从新字节开始。但是,我不明白为什么在结构的末尾有另一个未命名的位字段。它的目的是什么?有必要吗?
答案 0 :(得分:5)
它的目的是什么?有必要吗?
用于填充。您可以将其视为无法引用的匿名成员。
它是可选的,完全取决于您的布局要求。
答案 1 :(得分:5)
有必要吗?
不,这是可选的。
它的目的是什么?
这是标准在§9.6.2,C ++ 11(草案N3337,强调我的)中所说的内容:
省略标识符的位字段声明声明了未命名的位字段。未命名的位字段不是成员,无法初始化。 [注意:未命名的位字段对于填充符合外部强加的布局非常有用。 - 结束注释] 作为特殊情况,宽度为零的未命名位域指定分配单元边界处的下一个位域的对齐。只有在声明未命名的位域时,constant-expression的值才能等于零。
因此,这是对编译器的一个暗示,即总结struct
的所有成员导致2个八位字节,因此希望编译器将struct
2个八位字节变长。但是,根据标准,没有这样的要求。以下是前一点§9.6.1的摘录:
额外位用作填充位,不参与位域的值表示。在类中分配位字段 对象是实现定义的。位字段的对齐是实现定义的。比特字段被打包到一些可寻址的分配单元中。
因此,对于使用位域的struct
/ class
的大小或对齐,标准不保证任何其他内容。