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'に強制します(パフォーマンス警告)
この警告を修正する方法がわかりません。
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);
getStandardPlan()
はBOOL
を返します。これは実際にはint
のtypedefです(0はfalse
として解釈され、他のすべての値はtrue
として解釈されます)。私は通常、この問題を三項演算子で解決します。
poCola->m_bStandardPlan = plan->getStandardPlan() ? true : false;