BOOL和bool有什么区别?

45

在VC++中,我们有数据类型“BOOL”,它可以取值为TRUE或FALSE,还有数据类型“bool”,它可以取值为true或false。

它们之间有什么区别,应该在什么情况下使用每个数据类型?

3个回答

51

bool 是内置 C++ 类型,而 BOOL 是 Microsoft 特定的类型,它被定义为一个 int。你可以在 windef.h 中找到它:

typedef int                 BOOL;

#ifndef FALSE
#define FALSE               0
#endif

#ifndef TRUE
#define TRUE                1
#endif
< p > 一个 bool 类型的值可以是 true 或者 false,而对于 BOOL 类型,你可以使用任何 int 值,尽管在 windef.h 头文件中定义了 TRUEFALSE 宏。

这意味着对于 boolsizeof 运算符将返回 1(虽然标准规定 bool 的大小是实现定义的),而对于 BOOL,它将返回 4。

来源:Codeguru 文章


8
sizeof(BOOL) 在 64 位 Windows 计算机上仍然为4。这些typedef存在的原因是为了使其与编译器类型实现隔离。 - Hans Passant
1
@Hans 已删除了 64 位的引用。 - luvieere
7
警告:微软的C++中未指定sizeof(bool),在C++ 4.2和5.0之间已从4个字节更改为1个字节(请参见http://msdn.microsoft.com/en-US/en-use/library/tf4dy80a.aspx)。 - eFloh

16

在C++中添加bool类型之前,Windows API就已经有了这种类型。因此在所有需要使用BOOL的Windows函数中仍然存在它。C语言不支持bool数据类型,因此BOOL必须保留。


3
C99标准确实包含了bool类型,尽管大多数C编译器直到相对较近的时候才开始支持bool。 - PeterAllenWebb
如果你想在标准C中使用类似于C++的布尔类型,那么请包含头文件<stdbool.h>。 - Turret

15

补充一下luvieere所说的,从返回一个BOOL类型的函数中,你可以返回除TRUEFALSE之外的其他值,例如:

BOOL myFunc(int a)
{
    if (a < 3) return FALSE;
    else if (a > 3) return TRUE;
    else return 2;
}

这是可能的,因为BOOL本质上是一个int

请注意,这不是建议做法,因为它会严重破坏代码的可读性,但是你可能会遇到这种情况,然后你会想知道为什么会这样。


12
感谢您指出这是一个非常糟糕的想法。使用BOOL的整个意义在于将值限制为TRUE/FALSE;如果您想要int类型,应该使用int。 - Mark Ransom
1
许多(但不是全部)Windows API函数将任何非零的BOOL视为TRUE。由于这种行为不一致,您应该始终明确使用TRUE(即1),而不是非零值。这可能有些棘手,因为某些语言True定义为所有位设置(对于有符号整数为-1)。 - Marc Durdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接