不需要任何显式转换:
BOOL x = some_value;
bool b = x;
对于 的值和任何非零值,将数值类型隐式转换为bool
收益。false
0
true
顺便说一句,您已经告诉我们如何<windows.h>
定义FALSE
和TRUE
. 它是如何定义的BOOL
?(根据您的评论,它是typedef int BOOL;
)
但是一些编译器可能会警告这种隐式转换,即使它是完全有效的代码。编译器可以自由地警告他们喜欢的任何东西,包括你用来编写代码的丑陋字体。例如,g++ 不会抱怨转换,即使:
g++ -std=c++11 -pedantic -Wall -Wextra ...
但是根据这个在线 Visual C++ 编译器,VC++ 确实会产生一个警告:
warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
即使使用 a static_cast
,它仍然会产生警告。
您可以使用!!x
或来避免警告x ? true : false
。但我不确定治疗是否比疾病更好。
简单而正确的方法是简单地分配值并依靠隐式转换来做正确的事情(它会)。
如果您有避免编译器警告的附加要求,那么这将成为更多关于 Visual C++ 而不是 C++ 语言的问题。也可能有一些方法可以在不改变来源的情况下抑制某些警告——尽管当它们真正有意义时可能会丢失这些相同的警告。在评论中,Dieter Lücking 建议:
#pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning)
但这看起来仍然需要修改源。也许有一些等效的东西没有。
还有一件事:因为BOOL
真的是 type int
,所以这个建议的解决方案:
bool c = (x == TRUE);
不等于其他。任何非零int
都被视为真,但只有值1
等于。例如,上面将设置为if —— 而仍将其视为真实条件。永远不要将布尔值与or进行比较。(将它们与or比较更安全,但仍然没有必要;这就是操作员的目的。)TRUE
c
false
x == 2
if (x)
true
TRUE
false
FALSE
!
这一切都假设如果你有一个 type 的值BOOL
,你只关心它是虚假的还是真实的(零或非零)。不幸的是,情况可能并非总是如此。正如Ben Voight 的回答所指出的,Microsoft 的 API 至少包含一个函数GetMessage,它返回的BOOL
结果不是简单的布尔值。在这种可怕的情况下,如果您需要区分多个非零值,则从BOOL
to转换是不合适的。bool
最后,我责怪微软为BOOL
已经拥有完美表现的内置类型的语言定义了一个bool
类型。实际上这不太公平。它用于需要从 C 和 C++ 访问的 API。微软的定义BOOL
可能可以追溯到他们的 C 实现,这在某种程度上是有道理的——至少在微软仍然不支持的 C99 之前。(我不知道 Microsoft 的 C 编译器是否支持_Bool
. 即使支持,也与_Bool
有一些语义差异int
,并且更改 的定义BOOL
可能会破坏某些代码——尤其是使用. 的代码GetMessage
。)