2015-01-30 4 views
5

В Objective-C у нас есть разные ключевые слова для оценки булевых значений. У нас есть YES/NO, TRUE/FALSE и (c99) true/false. Я понимаю, BOOL против bool достаточно хорошо, и эта статья объясняет различия удивительно:Objective-C TRUE/FALSE vs true/false

http://www.bignerdranch.com/blog/bools-sharp-corners/

Так что YES/NO значит это не мой вопрос. Мой вопрос в том, в чем разница между TRUE/FALSE и true/false? Является ли прописная версия псевдонимом для YES/NO или псевдоним для (c99) true/false? Или это другое животное вообще (например, YES/NO)?

ответ

15

Идентификаторы YES и NO считаются стандартными литералами Objective-C для BOOL. Обычно вы не найдете YES, NO или BOOL вне исходного кода Objective-C. Обратите внимание, что эти идентификаторы на самом деле являются макросами, определенными в objc/objc.h.

Идентификаторы true и false являются стандартными C99 (как вы отметили), если вы #include <stdbool.h>. Обратите внимание, что, поскольку вы используете Objective-C, вы, вероятно, включаете stdbool.h косвенно, даже если вы этого не знаете. Например, Foundation.h включает в себя CoreFoundation.h, который включает в себя stdbool.h. Таким образом, довольно сложно скомпилировать современное приложение для iOS или Mac без получения true и false.

Идентификаторыи FALSE не являются стандартными. Это исторический багаж, определенный различными библиотеками. Библиотеки, возможно, были написаны до появления C99 или написаны после, но предназначены для поддержки компиляторов pre-C99 или просто написаны авторами, не знакомыми с булевыми литералами C99. На Mac некоторые примеры таких библиотек - Kerberos, XDR/RPC и ncurses. Самое главное, заголовки ядра Mach определяют TRUE и FALSE константы, и (как и в случае с stdbool.h) довольно сложно избежать этих конкретных определений, если вы создаете современное приложение для iOS или Mac.

Во всех случаях я мог бы найти, TRUE определяется как 1 или (1) и FALSE определяется как 0 или (0).

(Все библиотеки, которые я упоминал, и ядро ​​Mach, предшествуют C99 и, таким образом, оправдан в определении их собственных логических констант.)

+1

Из всех моих статей с похожими тегами в Google и в Google, это, безусловно, самый сжатый и взыскательный ответ, который можно было бы просить. –

1

Что касается Ncurses, то TRUE/FALSE/использование BOOL еще до C99 и документируется в XPG4 Curses с 1996 года. Скрипт configure ncurses проверяет и использует существующие значения C++ и c99, когда они доступны. См. Например, журнал изменений ncurses, начинающийся с early 1997

Смежные вопросы