bool是否是原生C类型?

我注意到Linux内核代码使用bool类型,但我以为bool类型是c++类型。bool是标准的C扩展名(例如,ISO C90)还是GCC扩展名?

382425 次浏览

不,在ISO C90中没有bool

下面是标准C(不是C99)中的关键字列表:

  • auto
  • break
  • case
  • char
  • const
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • signed
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

下面是一篇讨论内核和标准http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html中使用的其他与C的一些不同之处的文章

没有这样的东西,可能只是int的宏

C99在stdbool.h中定义了bool, truefalse

bool在当前的C - C99中存在,但在C89/90中不存在。

在C99中,本机类型实际上被称为_Bool,而bool是在stdbool.h中定义的标准库宏(预期解析为_Bool)。_Bool类型的对象包含0或1,而truefalse也是来自stdbool.h的宏。

顺便说一句,这意味着C预处理器将把#if true解释为#if 0,除非包含stdbool.h。同时,c++预处理器需要原生地将true识别为语言文字。

stdbool.h在c99年被引入

C99在stdbool.h中有它,但在C90中必须定义为类型定义或enum:

typedef int bool;
#define TRUE  1
#define FALSE 0


bool f = FALSE;
if (f) { ... }

另外:

typedef enum { FALSE, TRUE } boolean;


boolean b = FALSE;
if (b) { ... }

_Bool是C99中的关键字:它指定类型,就像intdouble一样。

6.5.2

2声明为_Bool类型的对象 是否大到足以存储值0 1 . < / p >

C99添加了一个内置的_Bool数据类型(详细信息见维基百科),如果你#include <stdbool.h>,它会提供bool作为_Bool的宏。

您特别提到了Linux内核。它假定存在_Bool,并在包括/ linux / types.h中提供了一个bool类型定义。

/* Many years ago, when the earth was still cooling, we used this: */


typedef enum
{
false = ( 1 == 0 ),
true = ( ! false )
} bool;


/* It has always worked for me. */

stdbool.h定义了宏truefalse,但请记住它们被定义为1和0。

这就是为什么sizeof(true)等于sizeof(int),对于32位架构是4。

C99添加了一个bool类型,它的语义与C中之前存在的几乎所有整数类型(包括用户定义的和用于此目的的编译器扩展类型)的语义根本不同,一些程序可能已经将其“类型定义”为bool

例如,给定bool a = 0.1, b=2, c=255, d=256;, C99 bool类型将把所有四个对象都设置为1。如果C89程序使用typedef unsigned char bool,对象将分别接收0、1、255和0。如果它使用char,则值可能如上所示,或者c可能为-1。如果它使用了编译器扩展bit__bit类型,则结果可能是0,0,1,0(将bit处理为大小为1的无符号位字段,或具有一个值位的无符号整数类型)。

从C23开始,booltruefalse都是C关键字,不需要任何__abc3。

bool成为基本的内置数据类型之一。

_Bool仍然有效,并被视为“替代拼写”。

头文件<stdbool.h>只提供了过时的宏__bool_true_false_are_defined,它扩展为整数常量1

你可以在这里找到最新的草案: https://open-std.org/JTC1/SC22/WG14/www/docs/n2912.pdf < / p >