Предупреждение C4800: "BOOL": принудительное значение 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

Принудительное значение boolean: (bool) делает предупреждение,!! оленья кожа

Предупреждение C4800: 'int': принудительное значение для bool 'true' или 'false' (предупреждение о производительности)

Я не уверен, как исправить это предупреждение.

Ответы

Ответ 1

BOOL - это typedef для int где-то в WinAPI. WinAPI - это API C, поэтому они не могут использовать С++ BOOL. Если вы не можете избавиться от него, вернув BOOL из функции, например. потому что вы не поддерживаете функцию, то вы можете использовать явную проверку против нуля, чтобы избавиться от предупреждения:

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

Еще одно соображение - добавить функцию, которая инкапсулирует проверку:

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

а затем

poCola->m_bStandardPlan = getStandardPlan(plan);

Ответ 2

getStandardPlan() возвращает a BOOL, который фактически является typedef из int (0 интерпретируется как false и все остальные значения как true). Обычно я решаю эту проблему с помощью тернарного оператора.

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