【问题标题】:Objective-C TRUE/FALSE vs true/falseObjective-C 真/假与真/假
【发布时间】:2015-03-30 10:36:26
【问题描述】:

在 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)?

【问题讨论】:

    标签: objective-c boolean


    【解决方案1】:

    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 之前的编译器,或者只是由不了解 C99 布尔文字的作者编写。在 Mac 上,此类库的一些示例是 Kerberos、XDR/RPC 和 ncurses。最重要的是,Mach 内核头文件定义了 TRUEFALSE 常量,并且(与 stdbool.h 一样)如果您正在构建现代 iOS 或 Mac 应用程序,很难避免这些特定定义。

    在我能找到的所有情况下,TRUE 定义为 1(1)FALSE 定义为 0(0)


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

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

    【讨论】:

    • 在我所有类似主题的谷歌搜索和堆栈文章中,这是迄今为止人们可以要求的最简洁和严格的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2014-02-17
      • 1970-01-01
      • 2017-02-20
      相关资源
      最近更新 更多