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

时间:2011-04-02 20:01:40

标签: objective-c c99 boolean

自C99起,C现在具有适当的布尔类型_Bool。 Objective-C作为C的严格超集继承了这一点,但是当它在20世纪80年代创建时,没有C布尔类型,所以Objective-C将BOOL定义为signed char

所有Cocoa都使用BOOL,我见过的所有非NeXT / Apple Cocoa代码也是如此。显然,为了与现有协议(例如-applicationShouldTerminateAfterLastWindowClosed:中的NSApplicationDelegate)兼容,如果除了避免警告之外没有其他原因,最好匹配已经声明的类型。

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

其他三个有用的注释:

  • @encode(_Bool)评估为"B"。 (@encode(BOOL)评估为"c"signed char。)
  • sizeof(_Bool)评估为1,后面是C99的定义,_Bool只有保持其两个可能值所需的大小。 (编辑:实际上,标准只表示它必须“足够大”才能保存这两个值;它不会设置上限,事实上,Mac OS X on 32-bit PowerPC defines it as 4 bytes.尺寸差异在可能的BOOL - vs .- bool兼容性问题下提交文件是另一回事。)
  • 在该注释中,_Bool的唯一两个可能值是1和0.任何其他值在分配时转换为其中一个,就好像您已经进行了双重否定({{1} })或测试不等式0(!!)。获得具有其他值的!= 0的唯一方法是通常的魔法:指针别名和联合。

有没有理由不在新代码中使用_Bool / _Bool

3 个答案:

答案 0 :(得分:2)

我认为你们几乎都回答了自己的问题 - 在新的Cocoa代码中不使用_Bool的原因是,直到Apple将其框架更改为使用_Bool(或更可能是stdbool.h中定义的bool),通过使用_Bool或bool来破坏约定和可能的兼容性(至少没有黑客攻击)。虽然我现在只在Cocoa程序中浸泡了几年,但我敢打赌,如果Apple完全使用_Bool,他们可能只是简单地重新定义BOOL宏以在幕后使用新类型,以避免无法编辑他们的框架和文档。

话虽这么说,(并且让我在前言中断言我还没有将C代码与Objective-C混合在一起并且不知道这样做的惯例),你有一个更好的案例来使用C函数中的新_Bool,可能需要注意的是它只在内部使用,并且不要求Objective-C方法传入_Bool,只是为了避免混淆未来的程序员。你当然也必须对总是需要C99编译感到满意,人们可能仍然有理由避免。考虑YES是1的宏而NO是0的宏,似乎没有太大的好处要求更新版本的C获得另一个仅使用1或0的char大小的值。

老实说,当它归结为它时,你可以解决任何这些原因,并且对可重用性有足够的hackery或限制,但最终的理由是它(当前)不是Cocoa / Objective-C俚语的一部分,它的好处可能不会超过可读性的损失和/或其他不那么知情的程序员阅读代码的混乱。

答案 1 :(得分: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

答案 2 :(得分:0)

我同意@pst。 Objective-C不隐藏C,但它仍然是C层之上的一层。这意味着Objective-C只是不同的层。

我认为这是关于语言上下文的问题。它并不总是很清楚,但我们知道C语境和Objective-C语境。与American vs Americano一样。它们本质上是相同的含义,但区分上下文,并且可能在上下文中有所不同。当这些小细节被积累时,它可以为读者提供一些明显的信息。它将有助于提高代码的可读性。

我相信你应该知道可读性的重要性。如果可读性不重要,我们不需要使用任何制表符或空格。 :)

作为另一个例子,有nilNULLstrlen()-[NSString length]BOOL可以说“我是Objective-C代码。” 强烈 _Bool不能。