布尔与BOOL

时间:2010-07-30 22:41:52

标签: objective-c cocoa cocoa-touch

  

可能重复:
  Objective-C : BOOL vs bool
  Is there any difference between BOOL and Boolean in Objective-C?

我注意到XCode中的自动完成,在Objective-C中有一个bool和一个BOOL。这些不同吗?为什么有两种不同的bool?

它们可以互换吗?

4 个答案:

答案 0 :(得分:9)

是的,他们是不同的。

  • C ++ bool,它是一个真正的布尔类型。在整数上下文中保证为0或1。
  • C99 _Bool作为真正的布尔类型,如果包含<stdbool.h>,则bool将成为_Bool的预处理器宏(此标头还将truefalse分别定义为10的预处理器宏。
  • Cocoa BOOL作为类型,但它只是signed char的typedef。它可以表示比0或1更多的值。
  • Carbon 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 ++真正布尔类型的旧代码中,这种类型的真正错误常常会发生。