среда, 23 января 2013 г.

BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

Это перевод BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool. Автор: Реймонд Чен.

Это просто ещё больше способов говорить про одно и то же. Но куда же ещё больше?

Потому что каждый такой тип был изобретён разными людьми в разное время и для решения разных проблем.

В Windows самым старым типом является BOOL. Он объявляется просто:
typedef int BOOL;
Язык программирования C использует тип int (т.е. просто число) в качестве логического типа, ну а Windows 1.0 была написана в те времена, когда язык C был главным языком для системного программирования.

Далее появляется BOOLEAN.
typedef BYTE  BOOLEAN;
Этот тип был введён в OS/2 командой разработчиков NT, когда они решили создать новую операционную систему с нуля. И этот тип перешёл Win32. Сегодня его можно увидеть в тех местах, где проглядывает дизайн из исходной NT - вроде подсистемы безопасности и взаимодействия с драйверами.

VARIANT_BOOL пришёл несколько со стороны.
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
Этот тип был придуман разработчиками Visual Basic. Basic использует -1 для представления true и 0 для представления false, поэтому так же был спроектирован и VARIANT_BOOL.

Частая ошибка: когда вы работаете с вариантами (VARIANT) типа VT_BOOL и хотите установить логическое значение "истина", вы должны использовать VARIANT_TRUE. Многие программисты ошибочно используют TRUE или true - но это не то же самое, что VARIANT_TRUE. Поэтому, поступая так, вы можете запутать некоторые языки (и аналогично - вам следует использовать VARIANT_FALSE вместо FALSE или false. Хотя эти три значения эквивалентны друг другу. Соответственно, подобная ошибка при использовании ложных значений не будет фатальной).

Самым новым типом является bool, который является типом данных C++ с возможными значениями true или false. Вы практически (или даже совсем) не увидите этот тип в Win32, потому что Win32 пытается оставаться C-совместимым.

(Заметьте, что "C-совместимость" - не то же самое, что "C-дружественность". К примеру, вы можете работать с COM из чистого C, но это далеко не так же удобно)

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.