如何在C89中将布尔值插入到位域中
据我所知,在C89中,所有布尔表达式都是整型。 这也意味着表示bool的函数参数通常由int
参数表示。
现在我的问题是我如何最理想地将这样一个int
放入一个位域,以便它只占用一个位(现在让我们忽略填充)。
这里的第一件事是使用哪种类型。 使用int
或任何其他无符号类型不起作用,因为当只有一个位时,只能表示-1
和0
(至少使用二进制补码)。
尽管-1
技术上评估为true
,但这并不理想,因为实际上将其分配而没有未定义的行为可能相当棘手。
所以应该为位域选择一个无符号类型:
typedef struct bitfield_with_boolean {
unsigned int boolean : 1;
} bitfield_with_boolean;
接下来的问题是如何分配该位域。 只是采取一个int
或类似的将无法工作,因为downcast会截断值,所以如果最低位未设置,则先前计算为true
的值现在会突然评估为false
。
据我所知,布尔运算符保证总是返回0
或1
。 所以我解决这个问题的想法是这样的:
#define to_boolean(expression) (!!(expression))
所以为了分配我会做的价值:
bitfield_with_boolean to_bitfield(int boolean) {
bitfield_with_boolean bitfield = {to_boolean(boolean)};
return bitfield;
}
这是正确的,还是有更好的方法?
注意:
我知道这个问题从C99开始就完全解决了,因为铸造到_Bool
将保证总是会导致0
或1
。 其中0
只是输入值为0
。
是的,你的解决方案是正确的。 但是,我不会将它隐藏在宏的后面,我不会使用all_lowercase
字母命名宏。
!!var
是足够的惯用语言,我会说在代码中很好。
替代品包括var != 0
,当然, var ? 1 : 0
var ? 1 : 0
。
上一篇: How to insert booleans into a bitfield in C89
下一篇: How to get SIZE