布尔是本地的C类型吗? 我注意到Linux内核代码使用BoL,但我认为BoL是C++类型。bool是标准C扩展(如ISO C90)还是GCC扩展?
否,ISO C90中没有布尔是本地的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
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. */