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

时间:2013-08-04 11:02:24

标签: c++ c boolean keyword

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

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

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

6 个答案:

答案 0 :(得分:16)

在C中,bool是一个宏。

C中没有bool名称的内置类型或关键字,因此典型的实现使用标准库#define truefalse来{分别为{1}}和1。诸如0语句的规则是根据“零”和“非零”表达式定义的,因此依赖于iftrue的扩展宏定义:< / p>

  

false在两种形式中,如果表达式比较不等于0,则执行第一个子语句。在else表单中,如果表达式比较等于0,则执行第二个子语句。如果通过标签,第二个子语句不执行。

为方便起见,C99添加了内置中间类型[C99: 6.8.4.1/2]:,此语言的实现通常为_Bool #definebool。因此定义了这种类型:

  

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

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


在C ++中,#define _Bool int既是内置类型,也是关键字。

您提供的链接并未说明{C}中的bool是一个宏。它说:

  

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

     

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

这是正确的。

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

词汇(即代码中的“外观”),bool将其列为关键字。事实上,作为整数类型名称一部分的所有标记也是关键字,包括(但不限于):

  • [C++11: 2.12/1]
  • int
  • unsigned
  • long
  • bool
  • short

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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

  

那么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。 [注意:没有签名,无符号,短或长   bool类型或值。 - 尾注] bool类型的值参与整体促销(4.5)。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在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
}

答案 5 :(得分:1)

在C _Bool中是一种类型booltruefalsestdbool.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