可能重复:
Objective-C : BOOL vs bool
Is there any difference between BOOL and Boolean in Objective-C?
我注意到XCode中的自动完成,在Objective-C中有一个bool和一个BOOL。这些不同吗?为什么有两种不同的bool?
它们可以互换吗?
答案 0 :(得分:9)
是的,他们是不同的。
bool
,它是一个真正的布尔类型。在整数上下文中保证为0或1。_Bool
作为真正的布尔类型,如果包含<stdbool.h>
,则bool
将成为_Bool
的预处理器宏(此标头还将true
和false
分别定义为1
和0
的预处理器宏。BOOL
作为类型,但它只是signed char
的typedef。它可以表示比0或1更多的值。Boolean
作为类型,但它只是unsigned char
的typedef。比如,Cocoa的BOOL
它可以表示更多的值,而不仅仅是0或1。对于Cocoa和Carbon的“布尔”类型,它们应该被认为是零意味着假,而任何非零值都意味着真实。
答案 1 :(得分:3)
BOOL
在Objective-C中定义为typedef signed char BOOL
,而bool
是在C99中定义的数据类型。
答案 2 :(得分:2)
BOOL实际上是一个签名字符(感谢Yuji),而bool
是来自ISO C99标准的真正布尔值。
见这里:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
答案 3 :(得分:2)
除非您需要与使用bool
的代码进行互操作,否则您应该使用BOOL
,因为bool
是真正的布尔类型而BOOL
不是。{1}}。我的意思是“真正的布尔类型”?我的意思是像这样的代码符合您的预期:
#define FLAG_A 0x00000001
#define FLAG_B 0x00000002
...
#define FLAG_F 0x00000020
struct S
{
// ...
unsigned int flags;
};
void doSomething(S* sList, bool withF)
{
for (S* s = sList; s; s = s->next)
{
if ((bool)(s->flags & FLAG_F) != withF)
continue;
// actually do something
}
}
因为(bool)(s->flags & FLAG_F)
可以依赖于评估为0或1.如果在演员表中这是BOOL
而不是bool
,则将不会< / em> work,因为withF
的计算结果为0或1,而(BOOL)(s->flags & FLAG_F)
的计算结果为0或FLAG_F的数值,在这种情况下,不是 1。
这个例子是设计的,是的,但是在不使用C99 / C ++真正布尔类型的旧代码中,这种类型的真正错误常常会发生。