不在Objective-C中使用_Bool的原因?
自C99以来,C现在有了一个合适的布尔类型,不在Objective-C中使用_Bool的原因?,objective-c,c99,boolean,Objective C,C99,Boolean,自C99以来,C现在有了一个合适的布尔类型,\u Bool。Objective-C作为C的一个严格超集继承了这一点,但当它在20世纪80年代创建时,没有C布尔类型,因此Objective-C将BOOL定义为signed char 所有Cocoa都使用BOOL,正如我所看到的所有非NeXT/Apple Cocoa代码一样。显然,为了与现有协议兼容(例如,-ApplicationsShouldTerminateAfterLastWindowClosed:fromnSapplicationElegat
\u Bool
。Objective-C作为C的一个严格超集继承了这一点,但当它在20世纪80年代创建时,没有C布尔类型,因此Objective-C将BOOL
定义为signed char
所有Cocoa都使用BOOL
,正如我所看到的所有非NeXT/Apple Cocoa代码一样。显然,为了与现有协议兼容(例如,-ApplicationsShouldTerminateAfterLastWindowClosed:
fromnSapplicationElegate
),最好与已声明的类型匹配,除非是为了避免警告
出于清洁/可读性的目的,stdbool.h
将bool
定义为\u bool
的同义词,因此我们这些不希望代码中出现不必要的下划线的人可以使用它
其他三个有用的注释:
计算结果为@encode(\u Bool)
。(“B”
对于@encode(BOOL)
,计算结果为有符号字符
)“c”
的计算结果为sizeof(\u Bool)
,根据C99的定义,1
仅为容纳其两个可能值所需的大小。(编辑:事实上,该标准只是说它必须“足够大”才能容纳这两个值;它没有设置上限,事实上,大小差异是另一个可能的\u Bool
-vs.-BOOL
兼容性问题。)BOOL
- 在这一点上,a
的两个可能值是1和0。任何其他值都会在赋值时转换为其中一个值,就像您对0进行了双重求反(\u Bool
)或测试了不等式(!!
)。获得具有其他值的!=0
的唯一方法是常用的魔术:指针别名和联合\u Bool
是否有任何理由不在新代码中使用
\u Bool
/Bool
对于C,我建议使用以下宏,这些宏也适用于ANSI-C(C-89):
我想你们几乎都回答了自己的问题——在新的Cocoa代码中不使用_-Bool的原因是,在苹果将其框架改为使用_-Bool(或者更可能是stdbool.h中定义的Bool)之前,使用_-Bool或Bool是在打破惯例,可能是兼容性(至少没有黑客攻击)。虽然我现在只沉迷于Cocoa编程几年了,但我敢打赌,如果苹果公司真的加入了_Bool,他们可能会简单地重新定义Bool宏,在幕后使用新类型,以避免对其框架及其文档进行无法形容的编辑 话虽如此,(让我先声明,我还没有将C代码与Objective-C混合在一起,也不知道这样做的惯例),在C函数中使用新的_Bool有更好的理由,可能需要注意的是,它只在内部使用,不要求Objective-C方法传入_Bool,只是为了避免未来程序员的困惑。当然,您还必须习惯于总是需要C99编译,人们可能仍然有理由避免这种情况。考虑到YES是1的宏,NO是0的宏,要求更新版本的C获得另一个仅使用1或0的字符大小的值似乎没有多大好处
老实说,归根结底,你可以通过足够的黑客手段或对可重用性的限制来避开这些原因,但最终的理由是,它(目前)不是Cocoa/Objective-C俚语的一部分,它的好处可能不会超过可读性的损失和/或其他不太了解你的代码的程序员阅读你的代码所带来的混乱。我同意@pst。Objective-C并没有隐藏C,但它仍然是C之上的一层。这意味着Objective-C只是不同的一层 我认为这是一个关于语言语境的问题。这并不总是很清楚,但我们知道C-context和Objective-C-context的类型。像
American
vsAmericano
。它们本质上是相同的意思,但区别于上下文,并且可能因上下文的不同而有所不同。当这些小细节积累起来时,它可以为读者提供一些明显的信息。它将有助于提高代码的可读性
我相信你们应该知道可读性的重要性。如果可读性不重要,我们不需要使用任何选项卡或空格。:)
作为另一个例子,有
nil
vsNULL
,strlen()
vs-[NSString length]
BOOL
可以说“我是客观的C代码。”strong哪个\u BOOL
不能。这并不能回答问题,这就是为什么我应该使用BOOL
而不是\u BOOL
(当与现有协议的兼容性不是问题时)。此外,此示例是未定义的行为:以两个下划线开头的标识符(以及下划线后跟大写字母)保留供实现使用。自己定义它们是很困难的。您可以定义bool
、true
和flase
,但前提是您的代码中不包含
。\uuuuubool\uTrue\uFalse\u定义由C标准在stdbool中指定,而stdbool在C-89中不可用。。。此宏允许您在C-89中使用bool。Objective-C不是“C的严格超集”,它是“特定C的严格超集”,可能与目标的特定Objective-C版本密切相关。。。不管怎样,闲聊一下:Objective-C也是关于约定的,对于特定的环境/环境集(如问题中所指出的),BOOL
是约定的一部分。我不会动摇这艘船,但没有“适当”的理由(例如,任何不兼容?)
#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