结构末尾的未命名位域的目的是什么

我正在学习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位未命名位字段用于让后续位从一个新字节开始。 但是,我不明白为什么在结构的末尾有另一个未命名的位字段。 它的目的是什么? 有必要吗?

有必要吗?

不,这是可选的。

它的目的是什么?

这是标准在§9.6.2,C ++ 11(草案N3337,强调我的)中所说的内容:

省略标识符的位字段声明声明了未命名的位字段。 未命名的位字段不是成员,无法初始化。 [注意:未命名的位字段对于填充符合外部强加的布局非常有用。 – 结束注释]作为特殊情况,宽度为零的未命名位域指定分配单元边界处的下一个位字段的对齐。 只有在声明未命名的位字段时,constant-expression的值才能等于零。

因此,这是对编译器的一个提示,即总结struct所有成员导致2个八位字节因此完成希望编译器将struct 2八位字节变长。 但是,根据标准,没有这样的要求。 以下是前一点§9.6.1的摘录:

额外的比特用作填充比特,并且不参与比特字段的值表示。 类对象中的位字段的分配是实现定义的。 位字段的对齐是实现定义的。 比特字段被打包到一些可寻址的分配单元中。

因此,对于使用位域的struct / class的大小或对齐,标准不能保证更进一步。

它的目的是什么? 有必要吗?

它用于填充。 您可以将其视为无法引用的匿名成员。

它是可选的,完全取决于您的布局要求。