题
我注意到Linux内核的代码使用bool,但我认为bool是用C++的类型。是bool标准C扩展(例如,ISO C90)或海湾合作委员会的扩展?
解决方案
bool
存在于当前的C-C99中,但不存在于C89 / 90中。
在C99中,本机类型实际上称为_Bool
,而stdbool.h
是true
中定义的标准库宏(预期解析为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中的关键字:它指定了一种类型,就像int
或double
一样。
6.5.2
2声明为_Bool类型的对象 足以存储值0 和1。
C99在true
中定义bool,false
和stdbool.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类型的一个值位)。