何时应该在C++中使用BOOL和bool?

zha*_*fei 20 c++ windows

何时应该在C++中使用BOOL和bool?为什么?

我认为使用bool更清洁,更便携,因为它是内置类型.但是当你使用遗留代码/ C代码进行交互,或者使用C代码/ Windows API从.NET进行交互操作时,BOOL是不可避免的.

所以我的政策是:在C++中使用bool.与外界交谈时使用BOOL,例如windows DLL中的导出功能.

关于何时使用一个而不是另一个,是否有明确的解释?

Dav*_*ley 9

如果BOOL是某种整数类型,并且它始终是,并且定义BOOL以使其正常工作,则标准转换将自动使其正确.你不能互换使用它们,但你可以接近.

在接口上使用BOOL,您必须与Win32 API或其他任何内容进行通信.在其他地方使用bool.


Jos*_*ley 7

Matthew Wilson 在Imperfect C++的第13.4.2节中讨论BOOL,bool和类似.混合这两者可能是有问题的,因为它们通常具有不同的尺寸(因此指针和参考不可互换),并且因为不保证具有任何特定尺寸.尝试使用typedef或条件编译来平滑之间的差异和/ 或试图允许单个布尔类型在C和C++中工作更糟糕的是:boolBOOLbool

#if defined(__cplusplus) || \
    defined(bool) /* for C compilation with C99 bool (macro) */
 typedef bool   bool_t;
#else
 typedef BOOL   bool_t;
#endif /* __cplusplus */
Run Code Online (Sandbox Code Playgroud)

这种方法意味着函数的返回类型可以根据哪种语言调用它而不同; 威尔逊解释说,他在自己的代码中看到了不止一个错误而其他错误也是由此产生的.他的结论是:

这种不完美的解决方案通常是禁欲.我从不使用bool任何可以跨多个链接单元访问的东西 - 动态/静态库,提供的目标文件 - 这基本上不是在头文件之外出现的函数或类中.实际答案,例如,是使用伪布尔类型,其大小为int.

简而言之,他会同意你的方法.

  • 我完全不明白为什么32位整数会转换为bool有问题.转换为bool很简单:零转换为false,其他任何转换为​​true.如果Wilson正在切断一个32位整数的字节,这是我认为可能发生这种情况的唯一方法,那么解决方案是编写没有愚蠢技巧的代码,并让编译器处理转换.同样地,从第三方BOOL转换为C++ bool没有危险,除非有人决定搞砸它. (2认同)