我知道BOOL实际上是signed char的一个typedef,但是Boolean又是什么呢?
bool、Boolean和BOOL之间有什么区别?
我知道BOOL实际上是signed char的一个typedef,但是Boolean又是什么呢?
bool、Boolean和BOOL之间有什么区别?
Boolean
是一个旧的 Carbon 关键字(历史上的 Mac 类型),定义为 unsigned char
。 BOOL
是 Objective-C 类型,被定义为signed char
。 bool
是标准 C 类型_Bool
的一种定义版本,它被定义为int
。使用 BOOL
。
编辑(2019年):苹果在一些新文档中讨论了关于BOOL
的底层实现。 在 macOS 上,BOOL
最终仍然是一个 signed char
,但在 iOS 和相关平台上,它是一个本地的C类型bool
。
Boolean
类型,因此在Objective-C中应该使用BOOL
,但在处理任何CoreFoundation API时仍然要使用Boolean
。 - bobDevilstdbool.h
,那么 bool
就是一个宏,展开为 _Bool
,它是一个内置的真布尔类型,代表 0 或 1,而不是一个 int
。 - dreamlaxbool
(包括在非 [Objective] C++ 编程时使用 stdbool.h
)。使用真正的布尔类型(只能采用值 0 和 1,任何非零整数都会自动转换为 true
)可以消除整个可能的错误类。 - zwol我不想削弱@JonShier有用的回答,但是我有更多要补充的内容,而这些内容在评论中不太合适...
bool
在C99规范中引入。 (C99标准于1999年“发布”,但在那之后还需要一些年才能广泛使用。)在此之前,“普通” C 没有内置的布尔类型,因此构建在 C 之上的库经常定义自己的类型。(即使在采用了 C99 编译器之后,它们通常仍然使用自己的类型来实现源/二进制兼容性。)
如果您正在编写 ISO C 并且没有在高级库的上下文中工作,则可以使用此选项。
Boolean
由Carbon(早期 OSX 版本的兼容性桥接层,用于与更旧的 Mac Toolbox 兼容)定义,您可能仍会在某些项目中看到它(由于传递性地包含头文件,这些头文件仅用于与真正的旧源代码兼容)。
请勿使用此选项。
BOOL
ObjC因为NeXTSTEP需要自己的布尔类型而定义了BOOL,这发生在1988年。(我在办公室书架上找到的最古老的objc.h文件是1992年的,其中包含BOOL的定义。)
ObjC中的BOOL通常被定义为typedef signed char
,这意味着它可以保存比YES(1)和NO(0)更多的值。如果你不小心就会有问题。(为什么要这样做?因为如果一个类型只有一位宽,它很难打包到对齐的内存中以获得良好的性能。)
然而,在iOS 64位(包括tvOS)和watchOS中,编译器定义了OBJC_BOOL_IS_BOOL
,这使得ObjC中的BOOL只是C99中bool
的别名。这意味着语言/编译器确保非零值总是存储为1,因此您不必担心typedef signed char BOOL
带来的问题。(但在macOS或32位iOS上仍需注意。)
如果你在使用ObjC框架(如Cocoa、UIKit等)进行编程,应该使用BOOL
以保持与你所交互的API的一致性。(此外,YES
和NO
比true
和false
更加突出,当你谈论绝对真理时,强调是很好的,不是吗?)
bool
比使用BOOL更具体和清晰。BOOL v = 2; NSLog(@"%d", v);
输出的是"1"而不是"2"。