警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

Posted

技术标签:

【中文标题】警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)【英文标题】:Warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) 【发布时间】: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) What is the performance implication of converting to bool in C++? 的可能重复项 【参考方案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++ 布尔值,许多开发人员仍在使用它们。

【讨论】:

以上是关于警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV YAML 解析布尔值

什么时候是布尔而不是布尔(编译器警告 C4800)

为啥用!!将 int 转换为 bool 时?

将值强制为布尔值:(bool) 发出警告,!!不

JAVA中int强制转换byte

GO值类型与引用类型