在Objective-C中,我们有不同的关键字来评估布尔值。我们有YES/NO
,TRUE/FALSE
和(c99) true/false
。我完全理解BOOL
vs bool
,本文非常精彩地解释了这些差异:
http://www.bignerdranch.com/blog/bools-sharp-corners/
那么YES/NO
意味着什么不是我的问题。我的问题是,TRUE/FALSE
和true/false
之间有什么区别?大写版本是YES/NO
的别名还是(c99) true/false
的别名?或者,它是另一种动物(如YES/NO
)吗?
答案 0 :(得分:17)
YES
和NO
标识符被视为BOOL
的标准Objective-C文字。您通常无法在Objective-C源代码之外找到YES
,NO
或BOOL
。请注意,这些标识符实际上是objc/objc.h
中定义的宏。
true
和false
标识符是标准C99(如您所述),如果您#include <stdbool.h>
。请注意,由于您使用的是Objective-C,即使您不知道,也可能间接包含stdbool.h
。例如,Foundation.h
包含CoreFoundation.h
,其中包含stdbool.h
。因此,在没有获得true
和false
的情况下编译现代iOS或Mac应用程序非常困难。
TRUE
和FALSE
标识符不是标准的。它们是各种图书馆定义的历史包袱。这些库可能是在C99出现之前编写的,或者是为了支持C99之前的编译器而编写的,或者只是由不了解C99布尔文字的作者编写的。在Mac上,此类库的一些示例是Kerberos,XDR / RPC和ncurses。最重要的是,Mach内核头定义了TRUE
和FALSE
常量,并且(与stdbool.h
一样)如果你正在构建一个现代的iOS或Mac应用程序,很难避免这些特定的定义
在我发现的所有情况下,TRUE
定义为1
或(1)
,FALSE
定义为0
或(0)
我提到的所有库和Mach内核都早于C99,因此在定义它们自己的布尔常量时是合理的。
自1991年以来,Objective Co的BOOL
,YES
和NO
出现在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更改日志