警告C4800:'BOOL':强制值为bool'true'或'false'(性能警告)

use*_*310 20 c++ visual-studio visual-c++

当我在Visual Studio 2008中编译下面的代码片段代码时,我收到此警告.

BOOL
CPlan::getStandardPlan() const
{
    return m_standardPlan;
}


bool m_bStandardPlan;

if(plan!=NULL)
{
    // Assign the values to the Cola object
    poCola->m_lPlanId           = plan->getPlanId();
    poCola->m_lPlanElementId        = plan->getPlanElementId();
    poCola->m_lPlanElementBaseId        = plan->getPlanElementBaseId();
    poCola->m_bStandardPlan         = plan->getStandardPlan(); //C4800

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我提到了以下链接,

http://msdn.microsoft.com/en-us/library/b6801kcy%28v=vs.90%29.aspx

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

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

我不确定如何修复此警告.

Arn*_*rtz 29

BOOLintWinAPI中某个地方的typedef .WinAPI是一个C API,所以他们不能使用C++ bool.如果你不能通过bool从函数返回一个来摆脱它,例如因为你没有维护函数,那么你可以使用显式检查零来消除警告:

poCola->m_bStandardPlan = (plan->getStandardPlan() != 0);
Run Code Online (Sandbox Code Playgroud)

另一个考虑因素是添加一个封装检查的函数:

bool getStandardPlan(CPlan const& plan) {
  return plan->getStandardPlan() != 0;
}
Run Code Online (Sandbox Code Playgroud)

然后

poCola->m_bStandardPlan = getStandardPlan(plan);
Run Code Online (Sandbox Code Playgroud)


Sim*_*son 9

getStandardPlan()返回一个BOOL实际上是一个typedef的int(0是false和其他所有值一样true).我通常用三元运算符解决这个问题.

poCola->m_bStandardPlan = plan->getStandardPlan() ? true : false;
Run Code Online (Sandbox Code Playgroud)