什么是C / C ++中的bool? 关键字还是宏?
我提到了这个问题 ,其中一些答案表明bool
是一个整数类型(IDE也将其视为关键字)。
但是,没有一个答案表明cplusplus中提供的信息,其中bool
是一个通过添加的宏(在这种情况下,编译器可能在编译时隐式添加此头文件以允许
bool
)。 这是的g ++版本。
那么bool
到底是什么? 一个整数类型的关键字或宏?
在C中, bool
是一个宏。
C中没有bool
名称的内置类型或关键字,因此典型的实现使用标准库分别将#define
true
和false
分别设置为1
和0
。 if
语句的规则是用“零”和“非零”表达式定义的,因此依赖于true
和false
的扩展宏定义:
[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
布尔文字是关键字false和true 。 这样的文字是prvalues并且有类型bool。
§3.9.1.6
bool类型的值为true或false。 [注意:没有signed,unsigned,short或long bool类型或值。 – 尾注] bool类型的值参与整体促销(4.5)。
在C ++中, bool
是一种内置数据类型。 在C中它不是,所以如果你在C中使用bool
它已经被实现为typedef或者#define
,而true
和false
必须用#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
是一个类型和bool
, true
和false
是在stdbool.h
定义的宏
ISO C11标准状态(在6.2.5类型中 )
声明为_Bool类型的对象足以存储值0和1。
stdbool.h
定义了4个宏。
-
bool
扩展到_Bool
-
true
,扩展为1
-
false
,扩展为0
-
__bool_true_false_are_defined
扩展为1
。