Там нет необходимости в какой-либо явного преобразования:
BOOL x = some_value;
bool b = x;
неявное преобразование числового типа в bool
дает false
для значения 0
и true
для любое ненулевое значение.
Кстати, вы сказали нам, как <windows.h>
определяет FALSE
и TRUE
. Как он определяет BOOL
? (Из вашего комментария, это typedef int BOOL;
)
Но некоторые компиляторы могут предупреждать об этом неявном преобразовании, даже если это совершенно правильный код. Компиляторы могут предупреждать о чем угодно, включая уродливый шрифт, который вы использовали для написания кода. г ++, например, не жалуется на преобразования, даже с:
g++ -std=c++11 -pedantic -Wall -Wextra ...
Но согласно this online Visual C++ compiler, VC++ действительно производит предупреждение:
warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
Даже с static_cast
, она по-прежнему производит предупреждение.
Вы можете избежать предупреждения, используя !!x
или x ? true : false
. Но я не уверен, что лечение лучше, чем болезнь.
Простой и правильный способ сделать это - просто назначить значение и полагаться на неявное преобразование, чтобы делать правильную вещь (она будет).
Если у вас есть дополнительные требования, чтобы избежать предупреждений компилятора, это становится скорее вопросом о Visual C++, а не о языке C++. Также может быть какой-то способ заблокировать определенные предупреждения без изменения источника - хотя это рискует потерять те же самые предупреждения, когда они действительно имеют смысл. В комментарии Дитер Люкинг предлагает:
#pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning)
но похоже, что он по-прежнему требует изменения источника. Возможно, есть что-то подобное, чего нет. более
одно: поскольку BOOL
действительно типа int
, это предложенное решение:
bool c = (x == TRUE);
не эквивалентен другим. Любое ненулевое значение int
считается истинным, но только значение 1
равно , равное - TRUE
.Вышеуказанное установит c
на false
, если x == 2
, например - тогда как if (x)
все равно будет считать это истинным условием. Никогда не сравнивайте логические значения для равенства с true
или TRUE
. (Сравнивая их false
или FALSE
безопаснее, но до сих пор нет необходимости, т. Е то, что оператор !
для)
Все это предполагает, что если у вас есть значение типа BOOL
, вы только заботитесь ли это falsish или truthy (ноль или ненулевое значение). К сожалению, это не всегда так. Как указывает Ben Voight's answer, API Microsoft включает в себя как минимум одну функцию, GetMessage, которая возвращает результат BOOL
, который равен , а не - простое булево значение. В таком ужасном случае преобразование с BOOL
в bool
не подходит, если вам нужно различать множество ненулевых значений.
В конечном счете, я обвиняю Microsoft в определении типа
BOOL
для языка, который уже имеет совершенно хорошо встроенный тип
bool
.
На самом деле это не совсем справедливо; он используется в API, которые должны быть доступны как с C, так и с C++. Определение Microsoft BOOL
, вероятно, восходит к их реализации C, где это имеет смысл - по крайней мере до C99, который Microsoft по-прежнему не поддерживает. (Я не знаю, даже если это произойдет, _Bool
, есть ли поддержка C компилятор от Microsoft _Bool
некоторые смысловые отличия от int
, и изменить определение BOOL
может нарушить код -.. В частности, код, использующий GetMessage
)
Что вы подразумеваете под «идиоматическим»? –
'bool c = (x = FALSE)'? :) – Inspired
Это, вероятно, неприемлемо для SO, потому что это сводится к личным вкусам, я считаю. – lpapp