什么是C / C ++中的bool? 关键字还是宏?

我提到了这个问题 ,其中一些答案表明bool是一个整数类型(IDE也将其视为关键字)。

但是,没有一个答案表明cplusplus中提供的信息,其中bool是一个通过添加的宏(在这种情况下,编译器可能在编译时隐式添加此头文件以允许bool )。 这是的g ++版本。

那么bool到底是什么? 一个整数类型的关键字或宏?

在C中, bool是一个宏。

C中没有bool名称的内置类型或关键字,因此典型的实现使用标准库分别将#define truefalse分别设置为10if语句的规则是用“零”和“非零”表达式定义的,因此依赖于truefalse的扩展宏定义:

[C99: 6.8.4.1/2]:在两种forms中,如果表达式将[C99: 6.8.4.1/2]:等于0,则执行第一[C99: 6.8.4.1/2]:语句。在else表单中,如果表达式比较等于0,则执行第二[C99: 6.8.4.1/2]:如果第一[C99: 6.8.4.1/2]:是通过标签到达,第二个子语句不执行。

为方便起见,C99添加了内置的中间类型_Bool ,这种语言的实现通常是#define bool_Bool 。 因此定义了这种类型:

[C99: 6.2.5/2]:声明为_Bool类型的对象足以存储值0和1。

这允许与C ++程序更好的兼容性,其中可能包括使用bool类型的函数声明; 实际上,# #define _Bool int可能已经足够了。


在C ++中, bool既是内置类型,也是关键字。

你提供的链接并没有说bool是C ++中的一个宏。 它说:

此标头的C的目的是添加bool类型以及true和false值作为宏定义。

在直接支持这些内容的C ++中,标头只包含一个宏,可用于检查是否支持该类型。

这是正确的。

在语义上 (也就是代码的“含义”), [C++11: 3.9.1/2]bool定义为C ++中的整数类型。

词法上 (即代码中的“外观”), [C++11: 2.12/1]将其列为关键字。 实际上,作为整数类型名称一部分的所有标记也是关键字,包括(但不限于):

  • int
  • unsigned
  • long
  • bool
  • short
  • signed

但是,它从来就不是 C ++中的宏。 相反,你会得到一个宏__bool_true_false_are_defined ,您可以在多语言代码中使用它来切换bool处理,具体取决于您使用的是C还是C ++; 请注意,我不确定我能想出一个有用的例子。

在C中, bool是一个来自stdbool.h的宏,它扩展为_Bool ,它是C布尔类型。

那么bool到底是什么? 一个整数类型的关键字或宏?

在C ++中,它被称为布尔文字 ,它是类型的内置。

§2.14.7

类型bool ,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称为整数类型

§2.14.6

布尔文字

 boolean-literal: false true 

布尔文字是关键字falsetrue 。 这样的文字是prvalues并且有类型bool。

§3.9.1.6

bool类型的值为true或false。 [注意:没有signed,unsigned,short或long bool类型或值。 – 尾注] bool类型的值参与整体促销(4.5)。

在C ++中, bool是一种内置数据类型。 在C中它不是,所以如果你在C中使用bool它已经被实现为typedef或者#define ,而truefalse必须用#define实现,或者可能是常量。

在C中没有像布尔变量这样的概念,是高级语言,如Java,C#和其他语言为我们提供了声明布尔变量的工具,我们将其用于标记目的,将其设置为true或false。

但是你可以像我们在C中那样使用积分来实现它

 if(1) { // Because C treats 1 and any other integer as true } if(0) { // This time our if condition will result in false } 

在C _Bool是一个类型和booltruefalse是在stdbool.h定义的宏

ISO C11标准状态(在6.2.5类型中

声明为_Bool类型的对象足以存储值0和1。

stdbool.h定义了4个宏。

  1. bool扩展到_Bool
  2. true ,扩展为1
  3. false ,扩展为0
  4. __bool_true_false_are_defined扩展为1