我提到了这个问题,其中一些答案表明它bool
是一个整体类型(IDE 也将其视为关键字)。
但是,没有一个答案表明cplusplus中提供的信息,它表示这bool
是一个通过添加的宏<cstdbool>
(在这种情况下,编译器可能会在编译时隐式添加此标头 allow bool
)。这是 g++ 版本的<stdbool.h>
.
那么究竟bool
是什么?整数类型关键字或宏?
bool
是一个宏。在 C 中没有内置类型或关键字bool
,因此典型的实现分别使用标准库 to#define
true
和false
to1
和0
。诸如if
语句的规则是根据“零”和“非零”表达式定义的,因此依赖于 and 的扩展宏true
定义false
:
[C99: 6.8.4.1/2]:
在这两种形式中,如果表达式比较不等于 0,则执行第一个子语句。在 else 形式中,如果表达式比较等于 0,则执行第二个子语句。如果通过标签到达第一个子语句,则不执行第二个子语句执行。
为方便起见,C99 添加了内置的中间类型_Bool
,并且通常将这种语言的实现添加#define
bool
到_Bool
. 这种类型是这样定义的:
[C99: 6.2.5/2]:
声明为类型的对象_Bool
大到足以存储值 0 和 1。
这允许与 C++ 程序更大的兼容性,其中可能包括使用该bool
类型的函数声明;不过,真的#define _Bool int
可能就足够了。
bool
既是内置类型又是关键字。您提供的链接并没有说这bool
是 C++ 中的宏。它说:
这个头文件在 C 中的目的是添加一个 bool 类型和 true 和 false 值作为宏定义。
在直接支持这些的 C++ 中,标头仅包含一个宏,可用于检查该类型是否受支持。
这是正确的。
在语义上(即,就代码的“含义”而言),在 C++ 中[C++11: 3.9.1/2]
定义bool
为整数类型。
在词法上(即,就代码中的“外观”而言),[C++11: 2.12/1]
将其列为关键字。事实上,所有作为整数类型名称一部分的标记也是关键字,包括(但不限于):
int
unsigned
long
bool
short
signed
但是,它绝不是 C++ 中的宏。相反,您会得到一个宏__bool_true_false_are_defined
,您可以在多语言代码中使用它来bool
根据您是使用 C 还是 C++ 来切换处理;请注意,我不确定我能想出一个有用的例子。
在 Cbool
中是一个宏,stdbool.h
它扩展为_Bool
C 布尔类型。
那么布尔究竟是什么?整数类型关键字或宏?
在 C++ 中,它被称为Boolean literal,它是内置类型。
§2.14.7
bool 、char、char16_t、char32_t、wchar_t类型以及有符号和无符号整数类型统称为整数类型。
§2.14.6
布尔文字
boolean-literal:
false
true
布尔文字是关键字false和true。这样的文字是纯右值并且具有 bool 类型。
§ 3.9.1.6
bool 类型的值为真或假。[ 注意:没有有符号、无符号、短或长布尔类型或值。— 尾注] bool 类型的值参与积分促销 (4.5)。
在 C 中没有像布尔变量这样的概念,是的,Java、C# 等高级语言为我们提供了声明布尔变量的工具,我们用它来标记布尔变量以将其设置为真或假。
但是您可以像我们在 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
.在 C++bool
中是一种内置数据类型。在 C 中它不是,所以如果你bool
在 C 中使用它已经实现为 typedef 或 with #define
,true
并且false
必须已经实现了#define
或者可能是常量。