如何清除位字段结构中的所有字段,除了一个?

时间:2016-07-12 07:16:34

标签: c

我有这个定义:

when

在我的代码中,我想清除整个位字段而不修改typedef struct { int foo :1; int bar :1; int baz :1; ... } bitfield; bitfield bf = {0};

一种解决方案是:

bar

是否有一种不需要任何临时布尔值的正确方法?

1 个答案:

答案 0 :(得分:10)

C位域 - struct对单个位不是很好用。更好地使用unsigned int和转移/屏蔽。无论如何,这都是在后台完成的。最好使用固定宽度类型,例如uint32_t等等。

示例中的代码调用了未定义的行为,正如我在评论中所述。您违反了有效类型(又名严格别名)规则。切勿像这样使用它。

但是,您可以使用复合文字:

bf = (bitfield){ .bar = bf.bar };

保留.bar并将所有其他字段设置为0

请注意您的代码还有另一个问题:您使用int。如果具有int类型的位域实际上是有符号或无符号的,则它是特定于实现的。因此,对于典型的实现,每个字段可以保留010-1。所以你把它留给实现。 _Bool OTOH总是未签名,其值为01。这与逻辑运算符的产量相同。 最好直接使用布尔字段:

typedef struct {
    bool foo : 1;
    ...
} bitfield;

(记住; s)