不需要任何显式转换:
BOOL x = some_value;
bool b = x;
对于 的值和任何非零值,将数值类型隐式转换为bool收益。false0true
顺便说一句,您已经告诉我们如何<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比较更安全,但仍然没有必要;这就是操作员的目的。)TRUEcfalsex == 2if (x)trueTRUEfalseFALSE!
这一切都假设如果你有一个 type 的值BOOL,你只关心它是虚假的还是真实的(零或非零)。不幸的是,情况可能并非总是如此。正如Ben Voight 的回答所指出的,Microsoft 的 API 至少包含一个函数GetMessage,它返回的BOOL结果不是简单的布尔值。在这种可怕的情况下,如果您需要区分多个非零值,则从BOOLto转换是不合适的。bool
最后,我责怪微软为BOOL已经拥有完美表现的内置类型的语言定义了一个bool类型。实际上这不太公平。它用于需要从 C 和 C++ 访问的 API。微软的定义BOOL可能可以追溯到他们的 C 实现,这在某种程度上是有道理的——至少在微软仍然不支持的 C99 之前。(我不知道 Microsoft 的 C 编译器是否支持_Bool. 即使支持,也与_Bool有一些语义差异int,并且更改 的定义BOOL可能会破坏某些代码——尤其是使用. 的代码GetMessage。)