【问题标题】:When should BOOL and bool be used in C++?什么时候应该在 C++ 中使用 BOOL 和 bool?
【发布时间】:2009-05-06 15:06:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 致反对者:为什么?如果您对问题投反对票,请发表评论
  • @James:大概是因为这个问题的结构是主观的,从主观意义上来说,这不是一个很好的问题。我试图改写它,这样它可能会更有价值,但我对此表示怀疑。
  • 为什么投反对票?这个不错。
  • 我投票决定重新开放。新的措辞使它成为一个有效的问题。

标签: c++ windows


【解决方案1】:

如果 BOOL 是某种整数类型,而且它一直都是,并且定义了 BOOL 以使其正常工作,那么标准转换将自动使其正确。你不能完全互换使用它们,但你可以接近。

在界面上使用 BOOL,您必须在此处与 Win32 API 或其他什么对话。在其他任何地方使用 bool。

【讨论】:

    【解决方案2】:

    Matthew Wilson 在Imperfect C++ 的第 13.4.2 节中讨论了 BOOLbool 和类似内容。将两者混合可能会出现问题,因为它们通常具有不同的大小(因此指针和引用不可互换),并且由于 bool 不能保证具有任何特定大小。尝试使用 typedefs 或条件编译来消除 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

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

    【讨论】:

    • 我完全无法理解为什么 32 位整数在转换为 bool 时会出现问题。转换为 bool 很简单:零转换为 false,任何其他转换为 true。如果 Wilson 截断 32 位整数的一个字节,这是我认为可能发生这种情况的唯一方法,那么解决方案是编写没有愚蠢技巧的代码,并让编译器处理转换。同样,从第三方 BOOL 转换为 C++ bool 也没有危险,除非有人下定决心要搞砸。
    • 你说得对,我没能跟得上他的榜样,所以遗漏了一些重要信息。 (Wilson 同意这是一个愚蠢的错误,但他认为代码应该尽可能地防白痴。)我更新了我的摘要以更好地解释。
    【解决方案3】:

    【讨论】:

    • 当然有充分的理由。第二篇文章说 Win32 使用 BOOL 来保持 C 兼容。如果您使用的是遗留代码,则需要使用 BOOL。
    • 我不明白为什么我需要使用 BOOL,因为 C99 支持 bool,而且我使用的所有 C89 编译器也支持它。此外,该问题被标记为 C++,而不是 C。
    • 如果我可以将 Win32 API 和 MFC 更改为使用现代 C++ 结构会简单得多,但由于我不能与它们交互。在我工作的地方,我们有三个不同的数组类型类。
    【解决方案4】:

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

    例如,EnumWindows() 采用指向具有以下签名的回调函数的指针:

    BOOL CALLBACK EnumWindowsProc(      
        HWND hwnd,
        LPARAM lParam
    );
    

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

    【讨论】:

      【解决方案5】:

      如果您希望在托管程序(例如 C#)中使用用 C++ 编写的函数(例如嵌入在 DLL 库中),您必须使用 BOOL。如果您返回 bool,结果将始终为真 - 这是很长一段时间以来已知的错误,显然尚未解决(VS 2010,.NET Framework 4)。

      最好的问候——Spook。

      【讨论】:

      • 当然!我遇到了这个错误,我花了很长时间才意识到这是 .NET 的错误。虽然有解决方法(属性)。
      【解决方案6】:

      我认为“true”/“TRUE”和“false”/“FALSE”是句法糖,是对从未存在的问题的解决方案。我一直认为使用和阅读“1”和“0”更容易。

      当您考虑寄存器中的标志打开或关闭时,您认为是 1 和 0 还是真假?如果你想在一个变量中存储多个标志会发生什么? 1 和 0 是通用的。

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

      所以,用 bool 和 BOOL 见鬼去吧。我默认为 int。

      ...但是,实际上,在与 C++ 一样容易出错的语言中,正确使用布尔标志是最不用担心的。

      【讨论】:

      • 这就像说战斗刀很危险,因为它可以戳出你的眼睛。儿子,你需要保持你的刀锋利并尊重它。因为,是的,如果你晃来晃去,它会夺走你的眼球。
      • 从未存在过的问题?真的吗?如果您看到返回类型为 bool 的函数,它会告诉您它可以返回 true 或 false。如果您看到返回类型为 int 的返回类型告诉您什么?
      • 我认为“假”这个词太长了。让我们来做代码压缩和加密...变量名太长了,我们用字母表吧;)。
      猜你喜欢
      • 1970-01-01
      • 2013-04-25
      • 2010-12-30
      • 2010-10-18
      • 2011-09-19
      • 2011-06-16
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多