我知道BOOL实际上是一个带有signed char的typedef,但是呢?呢?
bool,Boolean和BOOL有什么区别?
答案 0 :(得分:45)
Boolean
是旧的Carbon关键字(历史Mac类型),定义为unsigned char
。 BOOL
是定义为signed char
的Objective-C类型。 bool
是_Bool
标准C类型的定义版本。它被定义为int
。使用BOOL
。
编辑(2019):Apple在某些new documentation中讨论了BOOL
的基础实现。基本上,在macOS上,BOOL
仍然最终是signed char
,但在iOS和相关平台上,它下面是原生C bool
。
答案 1 :(得分:3)
我不想忘记@ JonShier的有用答案,但我还要补充一点而不是评论......
bool
在C99规范中引入标准C。 (C99标准于1999年发布,但在此之后花了几年才广泛使用。)在此之前,“普通”C没有内置的布尔类型,因此构建的库在C之上经常定义自己的。 (并且即使在他们接受C99编译器之后,也经常继续使用他们自己的类型来获得源/二进制兼容性。)
如果您正在编写ISO C并且不在具有自己的布尔类型的更高级库的上下文中工作,请使用此选项。
Boolean
由Carbon定义(早期的OSX-days兼容性桥接器来自更旧的Mac工具箱),您可能仍会在某些项目中看到这些桥接器(由于标头的传递#include
实际上只是为了与真的很老的源代码)。
不要使用它。
BOOL
由ObjC定义,因为NeXTSTEP在1988年需要它自己的布尔类型。(我在办公室书架上可以找到的最早的objc.h
日期为1992年,包括BOOL
的定义。)
ObjC BOOL
通常定义为typedef signed char
,这意味着它可以包含的值不仅仅是YES
(1)和NO
(0)。 That can be a problem if you aren't careful。 (为什么要这样做呢?因为如果一个类型是一位宽,很难打包到良好对齐的内存中以获得良好的性能。)
但是,在iOS 64位(包括tvOS)和watchOS中,编译器定义OBJC_BOOL_IS_BOOL
,这使得ObjC BOOL
只是C99 bool
的别名。这意味着语言/编译器确保非零值始终存储为1,因此您不会遇到来自typedef signed char BOOL
的问题。 (但仍然需要在macOS或32位iOS上担心它们。)
如果您使用ObjC框架(如Cocoa,UIKit等)在ObjC中工作,则应使用BOOL
与您正在交互的API保持一致。 (此外,YES
和NO
比true
和false
更响亮,当你谈论绝对真理时强调是对的,对吗?)
答案 2 :(得分:0)
如果您的新API不需要与旧API进行交互,bool
比BOOL更具体和明确。
使用Xcode 9构建非Mac应用程序时,BOOL v = 2; NSLog(@"%d", v);
输出" 1",而不是" 2"。