最近在搞跨平台编译的时候又遇到了 C99 标准支持的问题,主要体现在布尔类型问题上面。于是乎决定把这个问题彻底搞搞清楚,遂成此文。
【 bool、BOOL 和 _Bool 的区别 】
bool 类型在 C++ 中以关键字的形式被支持,表示布尔类型,其对应变量的值只有真(true)和假(false)两种值。
BOOL 类型在头文件 <windef.h> 中定义为 typedef int BOOL;在头文件 <wtypes.h> 中定义为 typedef long BOOL;
BOOL 类型的长度视实际环境来定,一般可认为是 4 个字节。
BOOL 是微软定义的表达布尔逻辑的类型。与 C++ 中的 bool 类型不同是,它是一个三值逻辑:TRUE、FALSE 和 ERROR。当返回值为大于 0 的整数时为 TRUE,返回值为 0 时为 FALSE,返回值为 -1 时为 ERROR。
_Bool 是 C99 标准中定义的一个新关键字,以提供布尔类型。C2008 草案中只规定了 _Bool 类型的大小至少应能够存放 0 和 1 这两个值。而并没有规定具体的大小。这交给编译器自由发挥了。
【跨平台如何使用布尔类型】
C++ 里有专门的 bool 关键字。但是在 C99 之前,C 语言里没有这样的类型。从 C99 标准开始,增加了关键字 _Bool 用来表示布尔类型。所以只要你的编译器支持 C99,你就可以直接使用布尔型了(当然,VC,VS系列编译器均不支持 C99)。除此之外,C99 为了在 C 中兼容 C++ 里对布尔类型的定义,又增加了一个头文件 stdbool.h。并在其中定义了 bool、true 和 false,让我们可以像 C++ 一样的定义和使用布尔类型。
使用布尔类型的几种方式:
a. 自己定义的“仿布尔类型”
在 C99 标准被支持之前,我们常常自己模仿定义布尔类型,方式有很多种,常见的有下面两种:
/* 第一种方法 */
1 2 3 |
|
/* 第二种方法 */
1 |
|
b. 使用 C99 新增的关键字 _Bool
C99 新增关键字 _Bool 类型的长度为 1,只能取值为 0 或 1 。将任意非零值赋值给 _Bool 类型变量,都会先转换为 1,表示为真。将零值赋值给 _Bool 类型,结果为 0,表示为假。
c. 使用 C99 新增头文件 stdbool.h
在 C++ 中,通过 bool 来定义布尔变量,通过 true 和 false 对布尔变量进行赋值。C99 为了让我们能够写出与 C++ 兼容的代码,添加了头文件 <stdbool.h> 。所以我们只要包含了该头文件,就可以像 C++ 中使用布尔变量的方式进行操作。
在我自己的 linux 系统中查找 stdbool.h 头文件,找到两处:
1. 系统定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
2. GCC 定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
其实这两个头文件的定义本身还隐形的说明了一些信息,阅者自斟。