我注意到 Linux 内核代码使用 bool,但我认为 bool 是 C++ 类型。bool 是标准 C 扩展(例如 ISO C90)还是 GCC 扩展?
11 回答
bool
存在于当前的 C - C99 中,但不存在于 C89/90 中。
在 C99 中,本机类型实际上被称为_Bool
,bool
而是一个标准库宏定义在stdbool.h
(预期解析为_Bool
)。类型的对象_Bool
持有 0 或 1,而true
和false
也是来自stdbool.h
.
请注意,顺便说一句,这意味着 C 预处理器将解释#if true
为#if 0
除非stdbool.h
包含在内。同时,C++ 预处理器需要本地识别true
为语言文字。
C99 添加了内置_Bool
数据类型(有关详细信息,请参阅Wikipedia),如果#include <stdbool.h>
您bool
使用_Bool
.
您特别询问了 Linux 内核。它假定存在并在include/linux/types.h_Bool
中提供了bool
typedef 本身。
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) { ... }
不,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
/* 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
or一样double
。
6.5.2
2 声明为 _Bool 类型的对象大到足以存储值 0 和 1。
C99 定义了 bool,true
并且false
在stdbool.h
.
stdbool.h
定义宏true
和false
,但请记住它们被定义为 1 和 0。
这就是为什么sizeof(true)
equals sizeof(int)
,对于 32 位架构,它是 4。
stdbool.h是在 c99 中引入的
C99 添加了一种bool
类型,其语义与之前在 C 中存在的几乎所有整数类型的语义完全不同,包括用于此类目的的用户定义和编译器扩展类型,并且某些程序可能具有“类型定义”到bool
.
例如,给定bool a = 0.1, b=2, c=255, d=256;
,C99bool
类型会将所有四个对象设置为 1。如果使用 C89 程序typedef unsigned char bool
,则对象将分别接收 0、1、255 和 0。如果使用char
,则值可能如上,也c
可能为 -1。如果它使用了编译器扩展bit
或__bit
类型,则结果可能是 0、0、1、0(bit
以等同于大小为 1 的无符号位字段或具有一个值位的无符号整数类型的方式处理)。
没有这样的东西,可能只是一个 int 的宏