【问题标题】:Warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)
【发布时间】:2014-01-04 10:20:40
【问题描述】:

我的代码中有这个问题:

bool CBase::isNumber()
{
return (id & MID_NUMBER);
}

bool CBase::isVar()
{
return (id & MID_VARIABLE);
}

bool CBase::isSymbol()
{
return (id & MID_SYMBOL);
}

【问题讨论】:

  • 你试过return (id & MID_NUMBER) > 0;吗?
  • id 或 MID_SYMBOL 必须是 BOOL 类型。这只是#define 到 Windows 中的 int 类型。您的返回值为 BOOL 并转换为 bool(true 或 false )。
  • (id & MID_NUMBER) != 0; 是避免警告的一般方法。
  • 我通常关闭的警告之一:#pragma warning(disable: 4800)

标签: c++ visual-c++-2010 visual-c++-2008


【解决方案1】:

仅供参考:演员表不会隐藏警告by design

类似

return (id & MID_NUMBER) != 0;

应该明确说明“我要检查这个值是否为零”并让编译器高兴

【讨论】:

    【解决方案2】:

    使用 !!成语如

    bool CBase::isNumber()
    {
        return !!(id & MID_NUMBER);
    }
    

    【讨论】:

    • 只是为了取悦编译器!??
    • @deviantfan 警告本身没用
    • @Lücking:为什么?当然编译器可以在不改变代码的情况下生成正确的东西,但也许编码器并没有打算进行隐式转换并因为警告而发现语义错误?
    • 首先反转它,这样你就得到了你真正想要的东西,第二个反转它,所以你得到了你真正想要的东西。当您混合使用 BOOL (windows)、Bool (xwindows) 和 bool (C++) 时很有用
    • @deviantfan :警告不是关于语义,而是关于性能,这是似是而非的。
    【解决方案3】:

    id 和 MID_NUMBER 的声明在哪里?你确定它们不是windef风格的BOOL而不是(小写的)布尔吗? BOOL 已经在 windef 中使用了几十年 typedef'd as an int;它们早于正确的 C++ 布尔值,许多开发人员仍在使用它们。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2020-10-22
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多