在许多程序中,我看到带有标识符FALSE
和false
的语句。在C ++的上下文中它们之间有什么区别吗?
同样在某些程序中,我看到bool
和某处BOOL
。这两者有什么区别?
有人可以向我解释这些标识符之间的区别吗?感谢。
答案 0 :(得分:24)
如果您已包含windows.h
,那么FALSE
#defined为0. TRUE
#defined为1. 不布尔类型,它是一个整数类型。 Windows还定义了类型BOOL
,它实际上是一个整数类型,旨在容纳值TRUE
和FALSE
。
windows.h
中相关的代码部分如下所示:
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1
typedef int BOOL, *PBOOL, *LPBOOL;
Windows最初是用C语言编写的,与所有原始Windows应用程序一样。那时,C没有标准定义的布尔类型。相反,开发人员被迫定义自己的布尔常量。为了防止可能造成的混乱,Microsoft决定采用一种可用于所有Windows应用程序的标准。
如果您正在编写Windows应用程序,则可能仍需要使用TRUE
和FALSE
标识符。 windows.h
中定义的几个函数接受布尔参数(实际上是整数!),键入为BOOL
或返回此类型的值。强类型的C ++如果将这些强制转换为语言标准中定义的布尔类型,可能会抱怨。为了保持一致性,我在所有对Windows API函数的调用中都使用了旧标识符,现在我自己编写的所有方法中都使用了标准定义的true
和false
关键字。
确实没有理由不使用FALSE
中定义的windows.h
。但是你不应该像其他人提到的那样在专有头文件中自己定义它,因为不能保证定义会随着时间的推移保持不变。这可能会导致一些非常愚蠢的错误,这种类型有资格出现在Daily WTF上。
Mat's answer 100%正确,{C}或C ++标准未定义TRUE
或FALSE
。但是,它们 是由Windows API严格定义的,并保证不会更改。使用它们不会产生真正的跨平台,严格符合标准的C ++代码,但在编写Windows应用程序时这很少是一个问题,因为它们都不会调用windows.h
中的任何其他函数。
答案 1 :(得分:14)
FALSE
未在标准中定义。只有false
。 true
和false
被称为“布尔文字”,是C ++中的关键字。
FALSE
有时被定义为宏。您不能依赖它出现在符合标准的环境中,因为它不是标准的一部分。
换句话说,以下程序有效C++
:
#include <iostream>
#define FALSE 1
int main()
{
bool a = false;
bool b = FALSE;
std::cout << a << " " << b << std::endl;
return 0;
}
并按预期打印0 1
。 FALSE
不是任何特权符号。
答案 2 :(得分:2)
在C ++中, false 是一个类型为boolean的内置文字,表示false值(另一个可能的值用文字 true 表示)
FALSE是#define,其定义可能取决于平台,但通常为0。
答案 3 :(得分:1)
false
是一个C ++关键字。
FALSE不是由C ++标准定义的。但是大多数编译器都将FALSE定义为值为0的预处理器宏。
答案 4 :(得分:1)
只要记住真假布尔人的意思。它们总是整数(0,1)。编译器可能无法识别它,但它们将始终存储并作为整数在CPU中运行。调试器会显示这个。它是否在大写中并不重要,因为它的实现或使用应该没有区别。如果你的编译器有一些宏来编写支持大小写的真假,那么很好,但它只是为了满足你的需要。就像所有其他类型一样。
答案 5 :(得分:0)
关于Windows API的重要说明:虽然返回类型定义为BOOL
,但某些WIndows库函数会返回任意整数值。最好永远不要将BOOL
与TRUE
进行比较。使用
bSomeVal != FALSE instead.