Принятие значения к логическому значению: (bool) делает предупреждение, !! оленья кожа - PullRequest
1 голос
/ 13 марта 2010

Мне нравится (bool) намного больше, но он генерирует предупреждения. Как мне избавиться от предупреждений?

У меня есть такой код:

bool something_else = 0;

void switcher(int val = -1){
    if(val != -1){
        something_else = (bool)val;
    }else{
        something_else ^= 1;
    }
}

Должен ли я просто сделать это, как все, и использовать '!!' или заставить его как-то скрывать предупреждающие сообщения при использовании (bool)? Или это "!!" на самом деле быстрее, чем (bool)?

Я хотел бы использовать (bool), и поэтому я должен скрыть предупреждение, но как?

Редактировать: Visual Studio 2008 я использую, извините, я забыл сказать.

Редактировать 2: Предупреждающее сообщение warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) И оно появляется на линии something_else = (bool)val; И на линии something_else = val; Но не на линии something_else = !!val;

Проблема в том, что я хочу, чтобы он уважал, что я хочу преобразовать его в логическое значение. Я не хочу скрывать все логические предупреждения, потому что иногда они спасли мою задницу.

Ответы [ 6 ]

14 голосов
/ 13 марта 2010

Вы должны использовать операторы и конструкции, специфичные для типа bool:

bool something_else = false;

void switcher(int val = -1)
{
    if(val == -1)    // val is -1 by default so THIS part is likely to execute
        something_else = !something_else;
    else
        something_else = (val != 0);
}

Если ваш псевдоним не требует пояснений, возможно, имеет смысл написать код, понятный другим. В случае этого конкретного вопроса правильное использование типа bool несомненно улучшит ваше дальнейшее сотрудничество с другими разработчиками.

7 голосов
/ 13 марта 2010

Вы можете сделать явное преобразование явным с помощью (val != 0). Поведение будет таким же, как приведение к типу bool или !!, но ваше намерение будет явным в отношении типа val.

2 голосов
/ 14 марта 2010

Я хотел бы использовать (bool), и поэтому я должен скрыть предупреждение, но как?

Почему бы вам не обратиться к документации компилятора по предупреждению? http://msdn.microsoft.com/en-us/library/b6801kcy(VS.71).aspx

Это предупреждение генерируется, когда значение это не bool назначается или по типу bool. Как правило, это сообщение вызвано назначением Переменные int для переменных bool где переменная int содержит только значения правда и ложь, и может быть объявлен как тип bool. Если вы не может переписать выражение для использования введите bool, тогда вы можете добавить «! = 0» к выражение, которое дает тип выражения bool . Кастинг выражение для типа bool не будет отключить предупреждение, которое по дизайн.

2 голосов
/ 13 марта 2010

Я получаю предупреждение с помощью VC ++:

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

Вы можете обойти это, если вы не «принудительно» вводите значение в bool, а присваиваете значение, которое уже является логическим:

something_else = val != 0;

(Не спрашивайте меня, почему это заслуживает того, чтобы быть предупреждением - среди предупреждений, сообщающих вам о серьезных проблемах (/ W3). ИМО, было бы намного лучше иметь специальный флаг для включения предупреждений о таких сомнительных значение.)

Но какова общая картина: переключать или использовать val (где -1 означает «не использовать»)?

Как насчет:

bool something_else = 0;

void switcher(bool val, bool use_val = false){
    if(use_val){
        something_else = val;
    }else{
        something_else = !something_else;
    }
}

Или с трибулами (никогда раньше не использовал)::)

#include <boost/logic/tribool.hpp>

bool something_else = false;

void switcher(boost::tribool val = boost::indeterminate){
    if(!indeterminate(val)){
        something_else = val;
    }else{
        something_else = !something_else;
    }
}
0 голосов
/ 14 марта 2010

Я не предлагаю это в этом случае, но вы всегда можете # pragra warning отключить .

#pragra warning disable # [, #]

Может также основываться на уровне предупреждения компилятора (http://msdn.microsoft.com/en-us/library/b6801kcy(VS.80).aspx).

0 голосов
/ 13 марта 2010

другой способ:

switch (val) {
  case -1: something_else = !something_else; break;
  case  0: something_else = false; break;
  default: something_else = true; break;
}
...