Я не хочу отказываться от полезного ответа @ JonShier, но я должен добавить больше, чем хорошо вписывается в комментарий ...
bool
Представленостандарт C в спецификации C99.(Стандарт C99 был опубликован в 1999 году, но потребовалось несколько лет после того, как он стал широко распространенным в использовании.) До этого «обычный» C не имел встроенного булева типа, поэтому библиотеки, основанные наВершина C часто определяется своими собственными.(И часто продолжали использовать свои собственные типы для совместимости исходного кода / двоичного кода даже после того, как они приняли компиляторы C99.)
Используйте это, если вы пишете ISO C и не работаете в контексте библиотек более высокого уровня с ихсобственные булевы типы.
Boolean
Определяется Carbon (мост совместимости ранних OSX с еще более старой версией Mac Toolbox), который вы все еще можете увидеть в некоторых проектах (из-за переходного процесса #include
заголовков, которые действительно только для совместимости с действительно старым исходным кодом).
Не используйте это.
BOOL
Определяется ObjC, поскольку NeXTSTEP нуждался в своем собственном логическом типе еще в 1988 году. (Самый старый objc.h
, который я могу найтина моей офисной книжной полке датируется 1992 годом и содержит определение BOOL
.)
ObjC BOOL
часто определяется как typedef signed char
, что означает, что он может содержать больше значений, чем просто YES
(1) и NO
(0). Это может быть проблемой, если вы не будете осторожны .(Зачем даже это делать? Потому что если тип имеет один бит ширины, его трудно упаковать в хорошо выровненную память для хорошей производительности.)
Однако в iOS 64-битной (включая tvOS) и watchOS,Компилятор определяет OBJC_BOOL_IS_BOOL
, что делает ObjC BOOL
просто псевдонимом для C99 bool
.Это означает, что язык / компилятор гарантирует, что ненулевые значения всегда сохраняются как 1, поэтому у вас нет проблем, связанных с typedef signed char BOOL
.(Тем не менее, по-прежнему нужно беспокоиться о них на macOS или 32-битной iOS.)
TLDR
Если вы работаете в ObjC с инфраструктурами ObjC (такими как Cocoa, UIKit и т. Д.), Выследует использовать BOOL
для согласованности с API, с которыми вы взаимодействуете.(Кроме того, YES
и NO
намного громче, чем true
и false
, и хорошо, когда вы говорите об абсолютной истине, нужно быть решительным, верно?)