web-dev-qa-db-ja.com

警告C4800: 'BOOL':値をブール値の 'true'または 'false'に強制します(パフォーマンス警告)

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

私は以下のリンクを参照しました、

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

ブール値に値を強制する:(bool)は警告を出しますが、!!はしません

警告C4800: 'int':値をブール値の 'true'または 'false'に強制します(パフォーマンス警告)

この警告を修正する方法がわかりません。

21
user3360310

BOOLは、WinAPIのどこかにあるintの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);
29
Arne Mertz

getStandardPlan()BOOLを返します。これは実際にはintのtypedefです(0はfalseとして解釈され、他のすべての値はtrueとして解釈されます)。私は通常、この問題を三項演算子で解決します。

poCola->m_bStandardPlan = plan->getStandardPlan() ? true : false;
9
Simon Karlsson