我有这个定义:
when
在我的代码中,我想清除整个位字段而不修改typedef struct {
int foo :1;
int bar :1;
int baz :1;
...
} bitfield;
bitfield bf = {0};
。
一种解决方案是:
bar
是否有一种不需要任何临时布尔值的正确方法?
答案 0 :(得分:10)
C位域 - struct
对单个位不是很好用。更好地使用unsigned int
和转移/屏蔽。无论如何,这都是在后台完成的。最好使用固定宽度类型,例如uint32_t
等等。
示例中的代码调用了未定义的行为,正如我在评论中所述。您违反了有效类型(又名严格别名)规则。切勿像这样使用它。
但是,您可以使用复合文字:
bf = (bitfield){ .bar = bf.bar };
保留.bar
并将所有其他字段设置为0
。
请注意您的代码还有另一个问题:您使用int
。如果具有int
类型的位域实际上是有符号或无符号的,则它是特定于实现的。因此,对于典型的实现,每个字段可以保留0
和1
或0
和-1
。所以你把它留给实现。 _Bool
OTOH总是未签名,其值为0
和1
。这与逻辑运算符的产量相同。
最好直接使用布尔字段:
typedef struct {
bool foo : 1;
...
} bitfield;
(记住;
s)