Objective-C中TRUE/FALSE与true/false的区别

6
在Objective-C中,我们有不同的关键字来评估布尔值。我们有YES/NOTRUE/FALSE(c99) true/false。我很好理解BOOLbool之间的区别,这篇文章精彩地解释了它们之间的不同:http://www.bignerdranch.com/blog/bools-sharp-corners/
因此,YES/NO的含义不是我的问题。我的问题是,TRUE/FALSEtrue/false之间有什么区别?大写版本是YES/NO的别名还是(c99) true/false的别名?或者,它是另一种完全不同的动物(如YES/NO)?
2个回答

18
YESNO 被认为是 Objective-C 中表示 BOOL 类型的标准字面量。你通常不会在 Objective-C 源代码之外找到 YESNOBOOL。注意,这些标识符实际上是定义在 objc/objc.h 中的宏。

truefalse 是标准的 C99 语言特性(正如您所指出的),如果你包括了 #include <stdbool.h>。请注意,由于您正在使用 Objective-C,即使您不知道也可能间接地包含了 stdbool.h。例如,Foundation.h 包括 CoreFoundation.hCoreFoundation.h 又包括 stdbool.h。因此,在编写现代的 iOS 或 Mac 应用程序时很难避免使用 truefalseTRUEFALSE这两个标识符并不是标准的,它们是由各种库定义的历史遗留物。这些库可能是在C99出现之前编写的,也可能是在C99之后编写但旨在支持旧版编译器,或者只是由对C99布尔字面量无知的作者编写的。在Mac上,这样的库的一些示例包括Kerberos、XDR/RPC和ncurses。最重要的是,Mach内核头文件定义了TRUEFALSE常量,并且(与stdbool.h一样)如果您正在构建现代iOS或Mac应用程序,则很难避免这些特定的定义。

在我找到的所有情况中,TRUE被定义为1(1),而FALSE被定义为0(0)

我提到的所有库和Mach内核都早于C99,因此有权定义自己的布尔常量。

Objective-C中的BOOLYESNO出现在Brad Cox的1991年著作面向对象编程:一种演化方法中,因此这些标识符也是合理的。


1
在我所有的谷歌搜索和类似主题的 Stack 文章中,这无疑是最简明精准的答案。 - user1068477

1
关于ncurses,TRUE/FALSE/bool的使用早于c99,并在1996年的XPG4 Curses中有记录。当现有的c++和c99值可用时,ncurses的配置脚本会检查并使用它们。例如,请参阅ncurses变更日志,从1997年初开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接