10

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

但是,没有一个答案表明cplusplus中提供的信息,它表示这bool是一个通过添加的宏<cstdbool>(在这种情况下,编译器可能会在编译时隐式添加此标头 allow bool)。这是 g++ 版本的<stdbool.h>.

那么究竟bool是什么?整数类型关键字或宏?

4

6 回答 6

19

在 C 中,bool是一个宏。

在 C 中没有内置类型或关键字bool,因此典型的实现分别使用标准库 to#define truefalseto10。诸如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可能就足够了。


在 C++ 中,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++ 来切换处理;请注意,我不确定我能想出一个有用的例子。

于 2013-08-04T11:05:51.510 回答
8

在 Cbool中是一个宏,stdbool.h它扩展为_BoolC 布尔类型。

于 2013-08-04T11:15:31.973 回答
4

那么布尔究竟是什么?整数类型关键字或宏?

在 C++ 中,它被称为Boolean literal,它是内置类型。

§2.14.7

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

§2.14.6

布尔文字

boolean-literal:
false
true

布尔文字是关键字falsetrue。这样的文字是纯右值并且具有 bool 类型。

§ 3.9.1.6

bool 类型的值为真或假。[ 注意:没有有符号、无符号、短或长布尔类型或值。— 尾注] bool 类型的值参与积分促销 (4.5)。

于 2013-08-04T11:09:17.670 回答
1

在 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
}
于 2013-08-04T11:06:39.193 回答
1

在 C_Bool中是一个类型booltrue并且false是定义在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.
于 2013-08-04T11:34:20.063 回答
1

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

于 2013-08-04T11:04:08.250 回答