在Objective-C中不使用_Bool的原因?

Pet*_*sey 19 boolean objective-c c99

从C99开始,C现在有一个合适的布尔类型_Bool.Objective-C作为C的严格超集继承了这一点,但是当它在20世纪80年代创建时,没有C布尔类型,所以Objective-C定义BOOLsigned char.

所有Cocoa都使用BOOL,就像我见过的所有非NeXT/Apple Cocoa代码一样.显然,为了与现有协议(例如,-applicationShouldTerminateAfterLastWindowClosed:来自NSApplicationDelegate)的兼容性,如果除了避免警告之外没有其他原因,则优选匹配已经声明的类型.

出于清洁/可读性的目的,stdbool.h将其定义bool为同义词_Bool,因此我们这些不希望在代码中使用不必要的下划线的人可以使用它.

其他三个有用的笔记:

  • @encode(_Bool)评估为"B".(@encode(BOOL)评估为"c",for signed char.)
  • sizeof(_Bool)1从C99的定义开始计算,该定义_Bool只有保持其两个可能值所需的大小.(编辑:实际上,标准只表示它必须"足够大"才能保存这两个值;它没有上限,事实上,32位PowerPC上的Mac OS X将其定义为4个字节.在可能的BOOL-vs.- bool兼容性问题下,大小差异是另一件事.)
  • 在这个注释中,a的唯一两个可能值_Bool是1和0.任何其他值在赋值时转换为其中一个,就好像你已经!!对0(!= 0)进行了双重否定()或测试不等式.获得_Bool一些其他值的唯一方法是通常的魔法:指针别名和联合.

是否有任何理由不在新代码中使用_Bool/ bool

Mac*_*ade 0

对于 Objective-C,只需使用 BOOL 数据类型...

对于 C,我推荐以下宏,它们也适用于 ANSI-C (C-89):

#ifndef __bool_true_false_are_defined
    #ifdef _Bool
        #define bool                        _Bool
    #else
        #define bool                        char
    #endif
    #define true                            1
    #define false                           0
    #define __bool_true_false_are_defined   1
#endif
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答问题,这就是为什么我应该使用“BOOL”而不是“_Bool”(当与现有协议的兼容性不是问题时)。 (3认同)
  • 此外,此示例是未定义的行为:以两个下划线(以及下划线后跟大写字母)开头的标识符被保留供实现使用。自己定义它们就是 UB。您可以定义“bool”、“true”和“flase”,但**仅**当您*不*在代码中包含“<stdbool.h>”时。 (2认同)