布尔是本地的C类型吗? 我注意到Linux内核代码使用BoL,但我认为BoL是C++类型。bool是标准C扩展(如ISO C90)还是GCC扩展?

布尔是本地的C类型吗? 我注意到Linux内核代码使用BoL,但我认为BoL是C++类型。bool是标准C扩展(如ISO C90)还是GCC扩展?,c,gcc,linux-kernel,boolean,C,Gcc,Linux Kernel,Boolean,否,ISO C90中没有bool 以下是标准C(不是C99)中的关键字列表: auto break 案例 char const 继续 默认值 do double else enum extern float 用于 goto if int long 寄存器 返回 short signed static struct 开关 typedef union unsigned void volatile while 这里有一篇文章讨论了内核和标准中使用的与C的一些其他区别:没有这样的东西,可能只是int

否,ISO C90中没有
bool

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

  • auto
  • break
  • 案例
  • char
  • const
  • 继续
  • 默认值
  • do
  • double
  • else
  • enum
  • extern
  • float
  • 用于
  • goto
  • if
  • int
  • long
  • 寄存器
  • 返回
  • short
  • signed
  • static
  • struct
  • 开关
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

这里有一篇文章讨论了内核和标准中使用的与C的一些其他区别:

没有这样的东西,可能只是int的宏定义了bool,
stdbool.h中的
true
false
在当前的C-C99中存在,但在C89/90中不存在

在C99中,本机类型实际上称为
\u Bool
,而
Bool
是在
stdbool.h
中定义的标准库宏(预期解析为
\u Bool
)。类型为
\u Bool
的对象保存0或1,而
true
false
也是
stdbool.h
中的宏

请注意,顺便说一句,这意味着C预处理器将把
#if true
解释为
#if 0
,除非包含
stdbool.h
。同时,C++预处理器需要作为一种语言文字来自动地识别<代码>真/代码>。

< P>在C99

中引入:P> C99有它,但是在C90中,它必须定义为TyPufF或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) { ... }

\u Bool
是C99中的一个关键字:它指定一种类型,就像
int
double
一样

6.5.2

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


C99添加了一个内置的
\u Bool
数据类型(有关详细信息,请参阅),如果您
\include
,它将
Bool
作为一个宏提供给
\u Bool


您特别询问了Linux内核。它假定存在
\u Bool
,并在中提供
Bool
typedef本身。

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


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

C99添加了一个
bool
类型,它的语义与C中以前存在的几乎所有整数类型的语义基本不同,包括用于此目的的用户定义类型和编译器扩展类型,有些程序可能具有“type def”编辑到
bool


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

至于原因,这是为了允许它不被定义和重新定义,因为它的定义可能会与遗留代码发生冲突。实际上,只要仍然没有合适的编译器支持,这真的很重要吗?就连gcc直到最近才拥有一半的C99功能,MSVC也没有,而且可能永远也不会拥有其中的大部分功能。@Jonathan Leffler,提问者特别询问了ISO C90.:)事实上,通常当人们提到ANSI C时,他们指的是C90。我不使用或真的打算使用C99,我想很多人都有同样的感觉。@BobbyShaftoe:最初的海报在评论中明确表示C90就是一个例子。使用-1很好。。。问题是C90,不是99,我相信他说的是C标准,例如C90,我想包括C99。他特别提到C90,不是C99,所以我认为他的意思是。根据维基百科的说法,唯一完全支持C99的编译器是Sun Microsystems的Sun Studio。现在,这几乎不是一个被广泛接受的标准,是吗?可以说,大多数现代编译器确实实现了C99标准的某些部分,我应该提到这一点,以避免像您这样愚蠢的评论!java或c与这个btw有什么关系?标准c扩展(例如ISO C90)是对他感兴趣的c标准类型进行分类,而不是对C90本身进行分类。一个恰当的答案是,是的,C标准,如C90,特别是C99标准,确实实现了
bool
类型。2011年发布了一个新的ISO C标准(在发布该答案之后)。与往常一样,ANSI采用了ISO C11标准作为ANSI标准。出于历史原因,“ANSI C”一词通常(但不正确)指的是ANSI C89/ISO C90标准定义的语言。由于C标准现在是由ISO首先发布的,并且有三个ISO C标准,采用程度各不相同,因此最好参考该标准发布的年份(ISO C90、ISO C99、ISO C11)以避免任何混淆。这是否意味着
\u Bool
占用1位内存?@Geremia:No.为什么?在C语言中,每个可寻址对象必须至少占用1个字节。
/* 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. */