【发布时间】:2016-09-12 08:26:19
【问题描述】:
在 C 中,可以通过指定不带名称的零宽度位域来强制一组位域在相对于其前身的新存储单元上开始,例如
int field1:10;
int :0;
int field2:5; // will be in a new storage unit
如果声明了两个连续的零宽度字段,是否有定义的行为,例如:
int field1:10;
int :0;
int :0;
int field2:5; // will be in a new storage unit
在查看 C90 和 C99 规范时,我看不到任何明确指定是否简单地忽略附加字段,或者是否可能导致整个附加存储单元被搁置的任何内容。
C99 标准规定 (§6.7.2.1):
作为一种特殊情况,宽度为 0 的位域结构成员 表示不再将位域打包到放置前一个位域(如果有的话)的单元中。
在我看来,这是模棱两可的 - 如果您将 :0 视为“虚拟”位域(尽管不占用任何存储空间),那么可以将上面的内容解读为下一个 :0 不能打包到同一个(非存储)同上一个。
我的编译器似乎确实忽略了额外的内容,但我想知道规范是否确实保证了这一点。
【问题讨论】:
-
你的编译器告诉你什么?
-
@alk 在这一点上无关紧要 - 问题是 标准 告诉我什么(目前很少)
-
为什么不去那里看看呢? port70.net/~nsz/c/c11/n1570.html#3.14p3
-
关于位字段的内容实际上是特定于实现的,我不希望在标准中找到任何指导。
-
我认为
:0位字段将填充零位或更多位以实现所需的对齐。如果它已经对齐,则填充量为零。这个想法不是跳过,而是填充最小量以实现所需的对齐。对齐后,后续的:0位字段(具有相同的大小类型说明符)应该无效。
标签: c language-lawyer bit-fields