我尝试在它们之间交换布尔类型,并且它起作用了。但是CFBooleanRef发出了警告。 毕竟它们之间有什么区别?
boolean_t a = true;
bool b = a;
Boolean c = b;
BOOL d = c;
CSSM_BOOL e = d;
_Bool f = e;
CGPDFBoolean g = f;
CFBooleanRef h = g;
答案 0 :(得分:4)
BOOL with 64-bit on iOS可以回答大多数问题(我很想将其重复使用,但是这里没有涉及其他几点)。
这个问题的90%由“历史”回答。 C中的布尔值定义为某种整数。那是什么8位?字大小?签?未签名?它们都有些不同,并且多年来,许多框架和系统都定义了自己的规范“布尔”类型。
boolean_t
来自Mach内核。 bool
在stdbool.h
(即C标准库)中定义,并且引用在C99中定义的_Bool
类型。
Boolean
是旧的Carbon类型。 CSSM_BOOL
来自CDSA安全框架。 CGPDFBoolean
是一种核心图形类型。
BOOL
是Objective-C的一部分(这里的所有其他内容实际上都是C)。有点不同,因为从技术上讲,它的值是YES
和NO
。但这实际上与其他实践相同。
这里唯一真正突出的是CFBoolRef
,这是完全不同的事情。它是对NSNumber
对象的引用。它与其他人确实不兼容。
但是潜在的问题是,在C的早期(头30年),没有用于“ true or false”的标准类型,因此创建了很多很多,其中有些非常轻微不同。随着时间的流逝,它们中的许多已经变得用其他术语来定义(例如,BOOL
现在通常但不总是定义为bool
)。但是他们都有自己的历史,因为没有标准。
此时您可能会问,谁在乎布尔值有多大? x = (int)1
和x = (unsigned long)1
在C语言中做不完全一样的事情吗?是的他们是这样。没关系直到....想象您传递一个指向通过引用更新的布尔值的指针(例如,[NSFileManager fileExistsAtPath:isDirectory:]
执行此操作)。那么大小非常非常重要。我在一个项目中遇到了这个问题,其中有人用C编译时将BOOL
定义为unsigned char
,而使用C ++编译时将bool
定义为BOOL
。因此,如果true == !false
位于标头中,则包含该标头的C和C ++会期望得到不同大小的结果。哦,那里的错误很棒。...onChange
失败时,很难调试。