[英]Do unnamed bit-fields have well-defined semantics?
是否保证以下代码可以正常成功终止?
#include <assert.h>
struct foo_s {
union {
struct {
unsigned a : 10;
unsigned : 6;
};
struct {
unsigned : 10;
unsigned b : 6;
};
struct {
unsigned : 10;
unsigned c : 6;
};
};
};
int main () {
struct foo_s f;
f.a = 0;
f.b = 1;
assert(f.a == 0);
return 0;
}
在回答另一个问题时 ,提出了一种可能性,即在还包含未命名位域的结构中分配给命名位域,可能会导致将任意数据写入这些位。 C.11§6.7.2.1¶12指出:
没有声明符但只有一个冒号和一个宽度的位域声明表示未命名的位域。
我的理解是,未命名的位域只是常规的位域,唯一的区别是这些位中的值不能直接通过名称获得。 是否允许一个实现从使用“假设”逻辑的实现中推断出来并在这些位中分配任意数据?
是的,我认为一个实现可以将任意位写入一个未命名的位字段。 我认为脚注126仅说明了为什么引入了宽度大于0的未命名位域的意图:
未命名的位域结构成员可用于填充以符合外部施加的布局。
因此,基本上未命名的位域具有与填充位相同的语义。 您只是不能依靠它们的内容。
在写入相邻命名位字段a
时,允许实现方案基本上忽略未命名位字段,从而大大简化了对该字段a
的处理。 无需读取未命名字段的当前值,并且可以一次完成原子操作。 就像可能包含在结构中的填充位一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.