C-如何将布尔人插入C89中的Bitfield.据我了解,



在C89中,所有布尔表达式都是类型的整数。这也意味着代表Bool的函数参数通常由int参数表示。

现在我的问题是我如何最好地服用这样的int并将其放入Bitfield,以便它只占据一点点(让我们暂时忽略填充(。

这里的第一件事是要使用哪种类型。使用int或任何其他无符号类型都无法使用,因为只有一个位,只能表示-10(至少有两个补充(。

虽然-1从技术上评估为true,但这不是理想的选择,因为从我的理解中实际分配了它可能会非常棘手。

因此,应该为Bitfield选择一种未签名类型:

typedef struct bitfield_with_boolean {
    unsigned int boolean : 1;
} bitfield_with_boolean;

下一个问题是如何分配该比特菲尔德。仅仅服用int或类似产品就无法正常工作,因为降低的值会截断该值,因此,如果未设置最低位,则以前可以对true进行评估的值现在会突然对false进行评估。

据我了解,据我了解,布尔运算符保证始终返回01。因此,我解决这个问题的想法是这样的:
#define to_boolean(expression) (!!(expression))

因此,为了分配我要做的值:

bitfield_with_boolean to_bitfield(int boolean) {
    bitfield_with_boolean bitfield = {to_boolean(boolean)};
    return bitfield;
}

是正确的,或者有更好的方法吗?

注意:

我知道该问题是从C99开始完全解决的,因为将铸造到_Bool可以始终导致01。其中0仅在输入值为0时才是结果。

是的,您的解决方案是正确的。但是,我不会将其隐藏在宏之后,也不会使用all_lowercase字母命名宏。

!!var足够惯用,我会说这在代码中很好。

替代方案包括var != 0,当然还有var ? 1 : 0

最新更新