Подтвердить что ты не робот

Когда следует использовать BOOL и bool в С++?

Когда BOOL и bool будут использоваться на С++ и почему?

Я думаю, что использование bool является более чистым и более портативным, потому что это встроенный тип. Но BOOL неизбежна, когда вы взаимодействуете с устаревшим кодом кода /C или выполняете операции с .NET с помощью кода C/Windows API.

Итак, моя политика: Используйте bool внутри С++. Используйте BOOL при разговоре с внешним миром, например, в функции экспорта в DLL Windows.

Есть ли окончательное объяснение того, когда использовать один над другим?

4b9b3361

Ответ 1

Мэтью Уилсон обсуждает BOOL, BOOL и аналогично в разделе 13.4.2 Imperfect С++. Смешивание двух может быть проблематичным, поскольку они обычно имеют разные размеры (и поэтому указатели и ссылки не являются взаимозаменяемыми), и поскольку BOOL не гарантированно имеет какой-либо конкретный размер. Пытаться использовать typedefs или условную компиляцию для сглаживания различий между BOOL и BOOL или пытаться позволить одному булевому типу работать как на 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.

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

Ответ 2

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

Используйте BOOL на интерфейсе, где вам нужно поговорить с Win32 API или любым другим. Используйте bool всюду.

Ответ 4

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

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

BOOL CALLBACK EnumWindowsProc(      
    HWND hwnd,
    LPARAM lParam
);

Если вы используете BOOL для этого, вам нужно будет вывести указатель на вашу функцию.

Ответ 5

Если вы хотите использовать функцию, написанную на С++ (например, встроенную в библиотеку DLL) в управляемой программе (например, на С#), вы должны использовать BOOL. Если вы вернете bool, результат всегда будет правдой - это известная ошибка в течение длительного времени и, по-видимому, еще не разрешена (VS 2010,.NET Framework 4).

С уважением - Spook.

Ответ 6

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

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

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

Итак, к черту с bool и BOOL. Я по умолчанию для int.

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