如何在没有警告的情况下优雅地翻转布尔值?

How to elegantly flip a BOOL, without a warning?

本文关键字:翻转 布尔值 情况下 警告      更新时间:2024-09-24

我想简单地翻转一个BOOL变量,但这会产生一个lnt逻辑位不匹配警告。

有没有一个优雅的解决方案?

BOOL bCloseButtons = FALSE;
bCloseButtons = !bCloseButtons;                 // Intellisense generate a logical-bitwise mismatch
bCloseButtons = bCloseButtons ? FALSE : TRUE;   // works, but not elegant in my eye
CButton m_btnPumpP1;
BOOL bLocked = FALSE;
m_btnPump_P1.EnableWindow(!bLocked);           // Intellisense generate a logigal-bitwise mismatch
m_btnPump_P1.EnableWindow(!((bool)bLocked))    // horrible, not readable

请改用代码中的bool值。翻转bool是应用一元!运算符的简单问题,例如value = !value;.

bool值传递到需要BOOL(又名int)值的 API 中,隐式执行从boolint的积分提升。这是明确定义的,不会触发任何警告。

同样,如果需要将BOOL返回值转换为类型为bool的值,则该转换也是隐式的。值0变为false,所有其他值变为true。这也不会引发任何警告。如果代码想要显式说明此转换,则以下表达式会按照隐式转换规则生成一个bool值:value_abi != FALSE


一点理由:BOOL是有符号 32 位整数的类型别名。它的存在只是为了以ABI稳定的方式描述API,因此今天编译的代码将在十年后继续运行,而无需重新编译。严格来说,它是在调用者和函数实现之间建立二进制协定的

。 在客户端代码中保留这些 ABI 类型通常没有用。如果要在C++中对标志进行建模,则显然boolean 值是最合适的类型。当需要将此值传递到 API 时,会将其转换为预期的 ABI 类型。在bool值的情况下,这是作为C++编程语言的整型类型提升规则的一部分自动完成的。在其他时候,您可能必须显式执行转换,尽管这种情况极为罕见。