在C89中,所有布尔表达式都是类型的整数。这也意味着代表Bool的函数参数通常由int
参数表示。
现在我的问题是我如何最好地服用这样的int
并将其放入Bitfield,以便它只占据一点点(让我们暂时忽略填充(。
这里的第一件事是要使用哪种类型。使用int
或任何其他无符号类型都无法使用,因为只有一个位,只能表示-1
和0
(至少有两个补充(。
虽然-1
从技术上评估为true
,但这不是理想的选择,因为从我的理解中实际分配了它可能会非常棘手。
因此,应该为Bitfield选择一种未签名类型:
typedef struct bitfield_with_boolean {
unsigned int boolean : 1;
} bitfield_with_boolean;
下一个问题是如何分配该比特菲尔德。仅仅服用int
或类似产品就无法正常工作,因为降低的值会截断该值,因此,如果未设置最低位,则以前可以对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
。