如何在没有警告的情况下优雅地翻转布尔值?
How to elegantly flip a BOOL, without a warning?
我想简单地翻转一个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 中,隐式执行从bool
到int
的积分提升。这是明确定义的,不会触发任何警告。
同样,如果需要将BOOL
返回值转换为类型为bool
的值,则该转换也是隐式的。值0
变为false
,所有其他值变为true
。这也不会引发任何警告。如果代码想要显式说明此转换,则以下表达式会按照隐式转换规则生成一个bool
值:value_abi != FALSE
。
一点理由:BOOL
是有符号 32 位整数的类型别名。它的存在只是为了以ABI稳定的方式描述API,因此今天编译的代码将在十年后继续运行,而无需重新编译。严格来说,它是在调用者和函数实现之间建立二进制协定的
。 在客户端代码中保留这些 ABI 类型通常没有用。如果要在C++中对标志进行建模,则显然bool
ean 值是最合适的类型。当需要将此值传递到 API 时,会将其转换为预期的 ABI 类型。在bool
值的情况下,这是作为C++编程语言的整型类型提升规则的一部分自动完成的。在其他时候,您可能必须显式执行转换,尽管这种情况极为罕见。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 为什么布尔值不能比作最后一点?
- 如何使用返回布尔值的函数?
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码