Objective-C TRUE / FALSE vs true / false

时间:2015-01-30 21:03:57

标签: objective-c boolean

在Objective-C中,我们有不同的关键字来评估布尔值。我们有YES/NOTRUE/FALSE(c99) true/false。我完全理解BOOL vs bool,本文非常精彩地解释了这些差异:

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

那么YES/NO意味着什么不是我的问题。我的问题是,TRUE/FALSEtrue/false之间有什么区别?大写版本是YES/NO的别名还是(c99) true/false的别名?或者,它是另一种动物(如YES/NO)吗?

2 个答案:

答案 0 :(得分:17)

YESNO标识符被视为BOOL的标准Objective-C文字。您通常无法在Objective-C源代码之外找到YESNOBOOL。请注意,这些标识符实际上是objc/objc.h中定义的宏。

truefalse标识符是标准C99(如您所述),如果您#include <stdbool.h>。请注意,由于您使用的是Objective-C,即使您不知道,也可能间接包含stdbool.h。例如,Foundation.h包含CoreFoundation.h,其中包含stdbool.h。因此,在没有获得truefalse的情况下编译现代iOS或Mac应用程序非常困难。

TRUEFALSE标识符不是标准的。它们是各种图书馆定义的历史包袱。这些库可能是在C99出现之前编写的,或者是为了支持C99之前的编译器而编写的,或者只是由不了解C99布尔文字的作者编写的。在Mac上,此类库的一些示例是Kerberos,XDR / RPC和ncurses。最重要的是,Mach内核头定义了TRUEFALSE常量,并且(与stdbool.h一样)如果你正在构建一个现代的iOS或Mac应用程序,很难避免这些特定的定义

在我发现的所有情况下,TRUE定义为1(1)FALSE定义为0(0)


我提到的所有库和Mach内核都早于C99,因此在定义它们自己的布尔常量时是合理的。

自1991年以来,Objective Co的BOOLYESNO出现在Brad Cox的Object-Oriented Programming: An Evolutionary Approach中,因此这些标识符也是合理的。

答案 1 :(得分:1)

关于ncurses,TRUE / FALSE / bool的使用早于c99,并在1996年的XPG4 Curses中有记录.ncurses的configure脚本检查并使用现有的c ++和c99值。例如,参见early 1997

中的ncurses更改日志