我注意到Linux内核的代码使用bool,但我认为bool是用C++的类型。是bool标准C扩展(例如,ISO C90)或海湾合作委员会的扩展?

有帮助吗?

解决方案

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

在C99中,本机类型实际上称为_Bool,而stdbool.htrue中定义的标准库宏(预期解析为false)。类型#if true的对象包含0或1,而#if 0和<=>也是<=>的宏。

请注意,顺便说一句,这意味着C预处理器会将<=>解释为<=>,除非包含<=>。同时,C ++预处理器需要将<=>本地识别为语言文字。

其他提示

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

你特别询问了Linux内核。它假定存在<=>并在 typedef本身= “noreferrer”>包括/ LINUX / types.h中

没有,没有 bool 在ISO C90.

这里有一个列表中的关键词标准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

这里的一篇文章讨论一些 其他的 差异与C中所用的核心和标准: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

C99在 stdbool.h 中有它,但在C90必须定义为typedef或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) { ... }
/* 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. */

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

  

6.5.2

     

2声明为_Bool类型的对象   足以存储值0   和1。

C99在true中定义bool,falsestdbool.h

stdbool.h 在c99中介绍

stdbool.h定义宏true和false,但记住它定义为1和0.

这就是为什么sizeof(true)是4。

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

C99加入一个 bool 类型的语义是根本不同于那些只是所有的整数类型已经存在之前在C,包括用户定义和编译器的扩展类型,旨在用于这样的目的,这些程序可能具有"类型清"ed到 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,或unsigned integer类型的一个值位)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top