为什么C布尔名为_Bool?

时间:2017-12-14 20:54:21

标签: c

为什么C使用单词_Bool来定义布尔值?虽然他们使用float这个词来表示花车而不是_Float

此外,为什么必须包含bool,为什么不是基本功能的一部分,例如float

3 个答案:

答案 0 :(得分:19)

_Bool最初不是在C中,而是在1999 C标准中添加。如果它被称为bool,那么大量现有代码将会中断,因为许多项目已经创建了自己的类型别名bool

C89标准预留了以_开头的标识符,后跟大写字符作为实现使用保留。这就是添加到C的新功能始终以这些名称开头的原因。 _Complex_Alignof_Static_assert是其他示例。

还有一个标题<stdbool.h>,它将bool别名为_Bool并定义truefalse;新标题或未定义bool的项目可以包含此标题。

答案 1 :(得分:1)

至于......

  

此外,为什么必须包含bool,为什么不包括float   基本功能,如stdbool.h

...我发现虽然您需要包含bool来获取bool,但这是一个方便和C ++兼容性功能,不是必需的。 _Bool_Bool的别名,在C99及更高版本中,您自动0 ,但即使这是非必要的。在C中,任何整数或指针值都可以解释为布尔值,NULL_Bool被解释为false,所有其他值被解释为true。这就是从一开始就在C中处理布尔值的方法,它仍然适用于符合最新标准的实现。

实际上,类型then本身只是这种行为的特例:它是一个整数类型,其最小要求是它能够表示值0和1.在布尔上下文中,它起作用与任何其他整数类型一样。

答案 2 :(得分:0)

C最初没有布尔类型,它是在1999年版本的语言(C99)中添加的。此时,C ++已经标准化(在1998年)使用类型bool,关键字falsetrue。为了使C布尔类型与C ++中的布尔类型分开,并防止新名称破坏旧的C代码,它被命名为_Bool

使用下划线后跟大写字母命名的原因是因为7.1.3中已经保证编译器,库或用户代码中不存在这样的标识符:

  

所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。

“保留用于任何用途”,意为保留用于C语言的未来版本。

因此,自C99以来添加到该语言的所有新语言关键字都以下划线命名,后跟首字母大写。 C99中的其他示例包括_Complex_Imaginary类型。

对于需要与C ++进行代码兼容的情况,创建了标题<stdbool.h>。它包含宏bool,扩展为_Bool。以及扩展为falsetrue的宏01

虽然注意到布尔语没有完全集成在C语言中,因为它们在C ++中。在C ++中,a == b之类的表达式给出类型为bool的结果,值为true或false。在C中,它给出类型为int的结果,值为1或0.这是出于向后兼容的原因,使用旧的C代码。