Когда BOOL и bool должны использоваться в C++?

Я нашел решение! Я установил обновление KB2932046 и KB2919355 и после перезагрузки попытался установить обновления онлайн! Это исправлено автоматически!

20
задан Flexo 30 April 2012 в 21:36
поделиться

5 ответов

Мэтью Уилсон обсуждает BOOL , bool и аналогичные в разделе 13.4.2 Несовершенный C ++ . Смешивание этих двух может быть проблематичным, поскольку они обычно имеют разные размеры (и поэтому указатели и ссылки не являются взаимозаменяемыми), и поскольку у bool не гарантированно будет какой-либо конкретный размер. Попытка использовать typedefs или условную компиляцию для сглаживания различий между BOOL и bool или попытка разрешить одному булевому типу работать как на C, так и на C ++ еще хуже:

#if defined(__cplusplus) || \
    defined(bool) /* for C compilation with C99 bool (macro) */
 typedef bool   bool_t;
#else
 typedef BOOL   bool_t;
#endif /* __cplusplus */

Этот подход означает, что тип возвращаемого значения функции может отличаться в зависимости от того, какой язык его вызывает; Уилсон объясняет, что он видел больше, чем одну ошибку в своем собственном коде и других, что вытекает из этого. Он делает вывод:

Решением этого недостатка является, как это часто бывает, воздержание. Я никогда не использую bool для чего-либо, что может быть доступно через несколько блоков ссылок - динамические / статические библиотеки, поставляемые объектные файлы - что в основном означает не в функциях или классах, которые появляются вне заголовочных файлов. Практический ответ, каким бы он ни был, заключается в использовании псевдобулева типа, размер которого равен int .

Короче говоря, он согласился бы с вашим подходом.

7
ответ дан 30 November 2019 в 01:08
поделиться

Другая ситуация, в которой следует использовать BOOL : при реализации функции обратного вызова, которая принимает или возвращает BOOL .

Например, EnumWindows () получает указатель на функцию обратного вызова со следующей сигнатурой:

BOOL CALLBACK EnumWindowsProc(      
    HWND hwnd,
    LPARAM lParam
);

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

2
ответ дан 30 November 2019 в 01:08
поделиться
4
ответ дан 30 November 2019 в 01:08
поделиться

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

Используйте BOOL в интерфейсе, где вам нужно взаимодействовать с Win32 API или чем-то еще. В остальном используйте bool.

9
ответ дан 30 November 2019 в 01:08
поделиться

Я думаю о "истинном"/"TRUE" и "ложном"/"FALSE" как о синтаксическом сахаре, решении проблемы, которой никогда не существовало. Я всегда думал, что проще использовать и читать "1" и "0".

Когда вы думаете о том, что флаги в регистрах включены или выключены, вы думаете в 1s и 0s или правда и фальшь? Что произойдет, если вы захотите сохранить несколько флагов в одной переменной? 1s и 0s универсальны.

Я думаю, что слово "ложь" слишком длинное для своего блага. Когда я вижу "0", оно выделяется у меня в голове, как красный стоп-знак. Знаки стоп - красные, потому что красный цвет привлекает внимание людей. Чтение слова "ложный" похоже на зеленый знак "стоп".

Итак, к черту шерсть и БУЛЬ. По умолчанию, я не знаю.

... но, на самом деле, правильное использование булевых флагов - это наименьшее беспокойство в языке, в котором столько же способов допустить ошибку, сколько и в C++.

-2
ответ дан 30 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: