Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不在Objective-C中使用_Bool的原因?_Objective C_C99_Boolean - Fatal编程技术网

不在Objective-C中使用_Bool的原因?

不在Objective-C中使用_Bool的原因?,objective-c,c99,boolean,Objective C,C99,Boolean,自C99以来,C现在有了一个合适的布尔类型,\u Bool。Objective-C作为C的一个严格超集继承了这一点,但当它在20世纪80年代创建时,没有C布尔类型,因此Objective-C将BOOL定义为signed char 所有Cocoa都使用BOOL,正如我所看到的所有非NeXT/Apple Cocoa代码一样。显然,为了与现有协议兼容(例如,-ApplicationsShouldTerminateAfterLastWindowClosed:fromnSapplicationElegat

自C99以来,C现在有了一个合适的布尔类型,
\u Bool
。Objective-C作为C的一个严格超集继承了这一点,但当它在20世纪80年代创建时,没有C布尔类型,因此Objective-C将
BOOL
定义为
signed char

所有Cocoa都使用
BOOL
,正如我所看到的所有非NeXT/Apple Cocoa代码一样。显然,为了与现有协议兼容(例如,
-ApplicationsShouldTerminateAfterLastWindowClosed:
from
nSapplicationElegate
),最好与已声明的类型匹配,除非是为了避免警告

出于清洁/可读性的目的,
stdbool.h
bool
定义为
\u bool
的同义词,因此我们这些不希望代码中出现不必要的下划线的人可以使用它

其他三个有用的注释:

  • @encode(\u Bool)
    计算结果为
    “B”
    。(
    @encode(BOOL)
    对于
    有符号字符
    ,计算结果为
    “c”
  • sizeof(\u Bool)
    的计算结果为
    1
    ,根据C99的定义,
    \u Bool
    仅为容纳其两个可能值所需的大小。(编辑:事实上,该标准只是说它必须“足够大”才能容纳这两个值;它没有设置上限,事实上,大小差异是另一个可能的
    BOOL
    -vs.-
    BOOL
    兼容性问题。)
  • 在这一点上,a
    \u Bool
    的两个可能值是1和0。任何其他值都会在赋值时转换为其中一个值,就像您对0进行了双重求反(
    !!
    )或测试了不等式(
    !=0
    )。获得具有其他值的
    \u Bool
    的唯一方法是常用的魔术:指针别名和联合

是否有任何理由不在新代码中使用
\u Bool
/
Bool

对于C,我建议使用以下宏,这些宏也适用于ANSI-C(C-89):


我想你们几乎都回答了自己的问题——在新的Cocoa代码中不使用_-Bool的原因是,在苹果将其框架改为使用_-Bool(或者更可能是stdbool.h中定义的Bool)之前,使用_-Bool或Bool是在打破惯例,可能是兼容性(至少没有黑客攻击)。虽然我现在只沉迷于Cocoa编程几年了,但我敢打赌,如果苹果公司真的加入了_Bool,他们可能会简单地重新定义Bool宏,在幕后使用新类型,以避免对其框架及其文档进行无法形容的编辑

话虽如此,(让我先声明,我还没有将C代码与Objective-C混合在一起,也不知道这样做的惯例),在C函数中使用新的_Bool有更好的理由,可能需要注意的是,它只在内部使用,不要求Objective-C方法传入_Bool,只是为了避免未来程序员的困惑。当然,您还必须习惯于总是需要C99编译,人们可能仍然有理由避免这种情况。考虑到YES是1的宏,NO是0的宏,要求更新版本的C获得另一个仅使用1或0的字符大小的值似乎没有多大好处


老实说,归根结底,你可以通过足够的黑客手段或对可重用性的限制来避开这些原因,但最终的理由是,它(目前)不是Cocoa/Objective-C俚语的一部分,它的好处可能不会超过可读性的损失和/或其他不太了解你的代码的程序员阅读你的代码所带来的混乱。

我同意@pst。Objective-C并没有隐藏C,但它仍然是C之上的一层。这意味着Objective-C只是不同的一层

我认为这是一个关于语言语境的问题。这并不总是很清楚,但我们知道C-context和Objective-C-context的类型。像
American
vs
Americano
。它们本质上是相同的意思,但区别于上下文,并且可能因上下文的不同而有所不同。当这些小细节积累起来时,它可以为读者提供一些明显的信息。它将有助于提高代码的可读性

我相信你们应该知道可读性的重要性。如果可读性不重要,我们不需要使用任何选项卡或空格。:)


作为另一个例子,有
nil
vs
NULL
strlen()
vs
-[NSString length]
BOOL
可以说“我是客观的C代码。”strong哪个
\u BOOL
不能。

这并不能回答问题,这就是为什么我应该使用
BOOL
而不是
\u BOOL
(当与现有协议的兼容性不是问题时)。此外,此示例是未定义的行为:以两个下划线开头的标识符(以及下划线后跟大写字母)保留供实现使用。自己定义它们是很困难的。您可以定义
bool
true
flase
,但前提是您的代码中不包含
。\uuuuubool\uTrue\uFalse\u定义由C标准在stdbool中指定,而stdbool在C-89中不可用。。。此宏允许您在C-89中使用bool。Objective-C不是“C的严格超集”,它是“特定C的严格超集”,可能与目标的特定Objective-C版本密切相关。。。不管怎样,闲聊一下:Objective-C也是关于约定的,对于特定的环境/环境集(如问题中所指出的),
BOOL
是约定的一部分。我不会动摇这艘船,但没有“适当”的理由(例如,任何不兼容?)
#ifndef __bool_true_false_are_defined
    #ifdef _Bool
        #define bool                        _Bool
    #else
        #define bool                        char
    #endif
    #define true                            1
    #define false                           0
    #define __bool_true_false_are_defined   1
#endif