1. BOOL
BOOL是微软定义的宏,实际上是int型,占4个字节(由实际系统决定),该定义位于VC目录下WINDEF.H、AFX.H,可以找到如下代码:
// WINDEF.H
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
// AFX.H
#define FALSE 0
#define TRUE 1
#define NULL 0
BOOL是一个三值逻辑,TRUE/FALSE/ERROR,返回值为>0的整数为TRUE,0为FALSE,-1为ERROR。(即0和非0区别)
Win32 API , MFC 中很多返回值为BOOL的函数都是三值逻辑,比如GetMessage()。
2. bool
bool(又叫布尔型)是标准C++数据类型,可取值true和false,(即0和1区别)。
它单独占一个字节。
如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。
3. 例子
右边的均为编译器的检测提示
bool x=3; //告警
bool x=1; //正确
BOOL x=3; //正确
BOOL x=3.3; //告警
4. 定义BOOL与bool原因(TRUE FALSE 与 true false)
问题:C语言中已经有true和false还有null,微软为什么还定义TRUE, FALSE, NULL?
回答:因为true,false, null内存空间占用1 ,而TRUE, FALSE, NULL内存空间占用4
根据intel CPU的内存分页机制,4字节可以防止内存松散,防止产生更多的内存碎片,有利于数据的传输。
5. 编写window API 错误提示
提示: warning C4800: “BOOL”: 将值强制为布尔值“true”或“false”(性能警告)
原因:它表示表达式的左值定义为bool,而这时右值为BOOL,故发生警告。
解决:方法1,可以重新定义左值为BOOL。
方法2,则可以向该表达式中添加“!=0”,它可使表达式成为 bool 类型。 将表达式转换为 bool 类型不会禁用警告。
6. 参考来源
[1]http://blog.csdn.net/wangningyu/article/details/4669020 博主:wangningyu
[2]http://hi.baidu.com/hduzn/item/01cfaee9eed011c6bbf37d0a 博主:我专注,我快乐