(C) 2008 蒋维
上周突然有人问我BOOL和bool的区别。留在这里备忘。
首先说在C89中,没有布尔值这个东西的定义。也就是说不是C语言标准支持的数据类型。但是在平时的代码中需要经常用到布尔型,所以常用的手法就是进行重定义一个BOOL的类型
BOOL的定义有好多种:
<code>
typedef BOOL unsigend char
typedef BOOL int
#define BOOL unsigend short
</code>
……
上面这些写法都正确。在不带任何库,任何框架的纯C情况下,如果你不手动定义BOOL类型就不能使用。编译器会报错的。
在C++和C99的标准后才加入了对bool类型的默认支持,也就是说你可以在C++和支持C99的C编译器中直接使用bool(全部小写)定义一个布尔变量。不用再手工定义。其实bool的实现和BOOL是类似的。也是使用现有类型进行了重定义。
另外就是BOOL和bool的数据大小。由于BOOL是有用户定义的所以大小就不固定。但是bool在内存中占据一个字节,也就是sizeof(bool) == 1。
还有就是注意TRUE和true的区别,和前面的描述一样,前者要手动定义,后者是C++和C99默认支持。
#define TRUE 1
#define FLASE !TRUE
在平时的代码中BOOL定义不好的华容易出现一些错误,比如:
BOOL foo( void )
{
return 2; //暂且不说返回2逻辑上是不是有问题
}
if ( foo() == TRUE ){
……
}else if ( foo() == FALSE ){
……
}
foo() == TRUE不是一种好的写法,既然是booleam类型就应该if( foo() ) 这样使用,但BOOL的定义不固定,所以编译器在进行严格语法检查时会给出警告。但写成if( foo() == TRUE )不但逻辑别扭,而且也容易错误。
所以BOOL类型一定要使用TRUE和FALSE来赋值。
以上
蒋维
<code>
typedef BOOL unsigend char
typedef BOOL int
#define BOOL unsigend short
</code>
……
上面这些写法都正确。在不带任何库,任何框架的纯C情况下,如果你不手动定义BOOL类型就不能使用。编译器会报错的。
在C++和C99的标准后才加入了对bool类型的默认支持,也就是说你可以在C++和支持C99的C编译器中直接使用bool(全部小写)定义一个布尔变量。不用再手工定义。其实bool的实现和BOOL是类似的。也是使用现有类型进行了重定义。
另外就是BOOL和bool的数据大小。由于BOOL是有用户定义的所以大小就不固定。但是bool在内存中占据一个字节,也就是sizeof(bool) == 1。
还有就是注意TRUE和true的区别,和前面的描述一样,前者要手动定义,后者是C++和C99默认支持。
#define TRUE 1
#define FLASE !TRUE
在平时的代码中BOOL定义不好的华容易出现一些错误,比如:
BOOL foo( void )
{
return 2; //暂且不说返回2逻辑上是不是有问题
}
if ( foo() == TRUE ){
……
}else if ( foo() == FALSE ){
……
}
foo() == TRUE不是一种好的写法,既然是booleam类型就应该if( foo() ) 这样使用,但BOOL的定义不固定,所以编译器在进行严格语法检查时会给出警告。但写成if( foo() == TRUE )不但逻辑别扭,而且也容易错误。
所以BOOL类型一定要使用TRUE和FALSE来赋值。
以上
蒋维