为什么BOOL在Objective-C中键入char?

时间:2013-01-14 21:55:22

标签: ios objective-c boolean

有人告诉我,Objective-C中的BOOL是unsigned char的typedef,YES&没有关键字是编码字符。这不是我第一次听到它。我已经看过这是因为Apple在C标准之前使用BOOL提供了一个_Bool类型,我错了吗?这个事实有什么好处吗?我们在浪费一些记忆吗?这是否提供了在函数中返回有价值数据的方法?使用它作为在发生某些意外行为时返回不同值的方法是否正确?

BOOL myFunction(int argument)
{
    BOOL result = YES; //The function generates the result
    if (someError == YES) {
        return 5;
    }
    return result;
}

3 个答案:

答案 0 :(得分:5)

  

我们是在浪费内存吗?

不,因为你不能得到一个小于char的变量:它总是一个字节。您可以在一个单词中打包表示布尔标志的多个位,但您必须手动执行 - 使用位移位,使用位字段等等。

  

这是否提供了在函数中返回有价值数据的方法?

不是真的:你所做的是一个黑客,虽然5肯定会通过系统进入调用者,并且在“普通”{{1}中被解释为YES声明,例如

if

然而,如果像这样使用它会失败:

if (myFunction(123)) {
    ...
}
  

使用它作为在发生某些意外行为时返回不同值的方法是否正确?

从可读性的角度来看总是不正确的;至于“做你想做的事”,你的里程可能会有所不同,具体取决于你的功能使用方式。

答案 1 :(得分:1)

有一个小优势:在许多平台(包括iOS,IIRC)上sizeof(_Bool) == sizeof(int),所以使用char可以稍微紧凑。

除了BOOL实际上是signed char,而不是char,所以@encode(BOOL)评估所有平台上的同一事物。这会使位域稍微复杂化,因为BOOL foo:1;似乎定义了1位有符号整数(IIRC,其行为未定义) - 显然unsigned char是更好的选择,但可能为时已晚。 / p>

_Bool也应该更好地优化,因为编译器可以对所使用的位模式做出假设,例如将a&&b替换为a&b(提供b是无副作用的)。一些架构在所有位设置时也表示“真实”,这对于屏蔽很有用(想到SSE比较指令)。

答案 2 :(得分:0)

Objective-C"中的

" BOOL不是无符号的char,它是Objective-C库定义它的任何东西。哪个是unsigned char或bool,具体取决于您的编译器设置(32位或64位)。两者都表现不同。使用32位编译器和64位编译器尝试此代码:

BOOL b = 256;
if (b) NSLog (@"b is true"); else NSLog (@"b is false");