是否可以保证以下代码可以正常成功终止?

#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;
}

在回答不同的question时,存在这样的可能性,即在还包含未命名位域的结构中分配给已命名位域的操作可能导致将任意数据写入这些位。 C.11§6.7.2.1¶12指出:



我的理解是,未命名的位域只是常规的位域,唯一的区别是这些位中的值不能直接通过名称获得。是否允许一个实现从使用“假设”逻辑的实现中推断出来并在这些位中分配任意数据?

最佳答案

是的,我认为一个实现可以将任意位写入一个未命名的位字段。我认为脚注126仅说明了为什么引入了宽度大于0的未命名位域的意图:



因此,基本上未命名的位域具有与填充位相同的语义。您只是不能依靠它们的内容。

在写入相邻的命名位字段a时,允许实现方案基本上忽略未命名的位字段,从而大大简化了该字段a的处理。无需读取未命名字段的当前值,并且可以一次完成原子操作。就像可能包含在结构中的填充位一样。

关于c - 未命名的位域是否具有定义明确的语义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18651062/

10-15 00:15