Так как C99, C теперь имеет собственный булев тип, _Bool
. Objective-C, как строгий надмножество C, наследует это, но когда он был создан еще в 1980-х годах, не было C-типа Boolean, поэтому Objective-C определено BOOL
как signed char
.
Все Cocoa использует BOOL
, как и весь код не-NeXT/Apple Cocoa, который я видел. Очевидно, что для совместимости с существующими протоколами (например, -applicationShouldTerminateAfterLastWindowClosed:
от NSApplicationDelegate
) предпочтительным является сопоставление уже заявленного типа, если только для предотвращения предупреждения.
Для целей чистоты/удобочитаемости stdbool.h
определяет BOOL
как синоним _Bool
, поэтому те из нас, кто не хочет лишних подчеркиваний в нашем коде, могут использовать это.
Три других полезных примечания:
-
@encode(_Bool)
оценивается как"B"
. (@encode(BOOL)
оценивается до"c"
, дляsigned char
.) -
sizeof(_Bool)
оценивается как1
, что следует из определения C99, что_Bool
является настолько большим, насколько необходимо для хранения двух возможных значений. ( Изменить: На самом деле, стандарт говорит только о том, что он должен быть "достаточно большим", чтобы удерживать эти два значения, он не устанавливает верхнюю границу и, по сути, Mac OS X на 32-битной PowerPC определяет ее как 4 байта. Разница в размерах - это еще одна вещь, которая может быть связана с возможными проблемами совместимостиBOOL
-vs.-BOOL
.) - В этом примечании единственными двумя возможными значениями a
_Bool
являются 1 и 0. Любые другие значения преобразуются в одно из них при назначении, как если бы вы делали двойное отрицание (!!
) или тестировали неравенство против 0 (!= 0
). Единственные способы получить_Bool
с некоторым другим значением - это обычные магии: наложение псевдонимов и союзы.
Есть ли причина не использовать _Bool
/BOOL
в новом коде?