我注意到Linux内核代码使用bool类型,但我以为bool类型是c++类型。bool是标准的C扩展名(例如,ISO C90)还是GCC扩展名?
不,在ISO C90中没有bool。
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, true和false。
stdbool.h
true
false
bool在当前的C - C99中存在,但在C89/90中不存在。
在C99中,本机类型实际上被称为_Bool,而bool是在stdbool.h中定义的标准库宏(预期解析为_Bool)。_Bool类型的对象包含0或1,而true和false也是来自stdbool.h的宏。
_Bool
顺便说一句,这意味着C预处理器将把#if true解释为#if 0,除非包含stdbool.h。同时,c++预处理器需要原生地将true识别为语言文字。
#if true
#if 0
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中的关键字:它指定类型,就像int或double一样。
6.5.2 2声明为_Bool类型的对象 是否大到足以存储值0 1 . < / p >
6.5.2
2声明为_Bool类型的对象 是否大到足以存储值0 1 . < / p >
C99添加了一个内置的_Bool数据类型(详细信息见维基百科),如果你#include <stdbool.h>,它会提供bool作为_Bool的宏。
#include <stdbool.h>
您特别提到了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定义了宏true和false,但请记住它们被定义为1和0。
这就是为什么sizeof(true)等于sizeof(int),对于32位架构是4。
sizeof(true)
sizeof(int)
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的无符号位字段,或具有一个值位的无符号整数类型)。
bool a = 0.1, b=2, c=255, d=256;
typedef unsigned char bool
c
bit
__bit
从C23开始,bool, true和false都是C关键字,不需要任何__abc3。
bool成为基本的内置数据类型之一。
_Bool仍然有效,并被视为“替代拼写”。
头文件<stdbool.h>只提供了过时的宏__bool_true_false_are_defined,它扩展为整数常量1。
<stdbool.h>
__bool_true_false_are_defined
1