2014-03-19 116 views
16

当我在Visual Studio 2008中编译下面的代码片段代码时,出现此警告。警告C4800:'BOOL':强制值为bool'true'或'false'(性能警告)

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; 
} 

我提到以下链接,

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

Forcing value to boolean: (bool) makes warning, !! doesnt

Warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

我不知道如何解决这个问题的警告。

+0

你为什么不使用'bool',而不是'BOOL'作为首位返回值? – Henrik

+0

@Henrik如果user3360310没有采用微软的“前缀一切与C”符号,“CPlan”看起来很像一个MS库中的类,所以签名不能改变。 –

回答

21

BOOLint介于WinAPI的一个typedef。 WinAPI是一个C API,所以他们不能使用C++的bool。如果您不能通过返回功能中的bool来解决该问题,例如因为你不保持功能,那么你可以使用针对零明确的检查,以摆脱警告:

poCola->m_bStandardPlan = (plan->getStandardPlan() != 0); 

另一个考虑是添加封装检查的功能:

bool getStandardPlan(CPlan const& plan) { 
    return plan->getStandardPlan() != 0; 
} 

然后

poCola->m_bStandardPlan = getStandardPlan(plan); 
+0

非常感谢修复和解释@Arne。这固定了警告。 – user3360310

7

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

poCola->m_bStandardPlan = plan->getStandardPlan() ? true : false; 
+0

谢谢@ k4rlsson。我现在明白了为什么编译器会抛出这个警告。 – user3360310