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