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

时间:2009-05-06 15:06:22

标签: c++ windows

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

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

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

是否有明确的解释,说明何时使用其中一个?

6 个答案:

答案 0 :(得分:9)

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

在界面上使用BOOL,您必须与Win32 API或其他任何人交谈。在其他地方使用bool。

答案 1 :(得分:7)

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

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

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

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

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

答案 2 :(得分:4)

答案 3 :(得分:2)

另一种应该使用BOOL的情况:实现一个接收或返回BOOL的回调函数。

例如,EnumWindows()使用以下签名获取指向回调函数的指针:

BOOL CALLBACK EnumWindowsProc(      
    HWND hwnd,
    LPARAM lParam
);

如果您使用bool,则必须对函数指针进行类型转换。

答案 4 :(得分:1)

如果您希望在托管程序中使用用C ++编写的函数(例如嵌入在DLL库中)(例如在C#中),则 使用BOOL。如果你返回bool,结果将永远为真 - 这是已知的bug很长一段时间,显然还没有解决(VS 2010,.NET Framework 4)。

致敬 - Spook。

答案 5 :(得分:-2)

我认为“真”/“真”和“假”/“假”作为语法糖,解决一个从未存在过的问题。我一直认为使用和阅读“1”和“0”更容易。

当你考虑登记册中的标志是打开还是关闭时,你认为1和0还是真实和虚假?如果要在单个变量中存储多个标志会发生什么? 1和0是通用的。

我认为“假”这个词对自己的好处来说太长了。当我看到一个“0”时,它在我脑海中就像一个红色的停止标志。停车标志是红色的,因为红色会引起人们的注意。读“假”这个词就像看到一个绿色的停止标志。

所以,与bool和BOOL一起下地狱。我默认为int。

...但是,实际上,正确地获取布尔标志是一种语言中最不用担心的,因为有很多方法可以像C ++一样犯错误。