FALSE
和 false
的语句。在 C++ 的上下文中,它们之间有什么区别吗?此外,在一些程序中,我看到了
bool
和 BOOL
,这两者之间有什么区别?有谁能向我解释这些标识符之间的区别?谢谢。
windows.h
头文件,那么FALSE
被定义为0。TRUE
被定义为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语言标准没有定义布尔类型。开发人员不得不定义自己的布尔常量。为了避免可能带来的混乱,微软决定采用一种标准,将其用于所有Windows应用程序。
如果你正在编写Windows应用程序,可能仍需要使用TRUE
和FALSE
这两个标识符。在windows.h
中定义的多个函数要么接受布尔参数(实际上是整数!),类型为BOOL
,要么返回此类类型的值。由于C++具有强类型,因此如果您将它们强制转换为语言标准中定义的布尔型,则可能会出现警告。为确保一致性,在我调用Windows API函数时使用旧标识符,在我自己编写的所有方法中使用标准中定义的true
和false
关键字。
实际上没有理由不使用windows.h
中定义的FALSE
。但是,您不应使用专有头文件中自己定义的布尔常量,正如其他人所提到的那样,因为不能保证定义随时间的变化而保持不变。这可能会导致一些非常愚蠢的错误,这种错误充其量只能出现在《每日WTF》上。
Mat's answer完全正确,C或C++标准都没有定义TRUE
或FALSE
。但是,它们由Windows API严格定义并保证不会更改。在编写Windows应用程序时使用它们不会产生真正跨平台、符合标准的C++代码,但这很少是一个关注点,因为调用windows.h
中的任何其他函数也不会。
bool
是C++标准中定义的布尔类型。它与同样小写的true
和false
关键字一起使用。BOOL
是一个整数类型,由windows.h
定义,旨在与同样大写的TRUE
和FALSE
一起使用。很容易记住,因为每个组的情况都匹配。 - Cody GrayBOOL
类型只定义为与TRUE
和FALSE
一起使用。这都是windows.h
的一部分。如果您没有理解我的上一条评论,我很乐意进一步解释。 :-) - Cody Graybool
和BOOL
之间区别的评论。我猜你现在已经删除了那个评论,因为你看到了我在它之前发布的评论。 - Cody GrayBOOL
类型(*PBOOL
)的指针,以及指向BOOL
类型的长指针(*LPBOOL
)。如果你知道C ++,你已经知道指针了。你永远不需要知道长指针;当Windows 95在1995年推出时,它们变得不相关了。它们是旧的DOS / Win16事物,在微处理器架构不同的情况下很重要。现在只是历史的一种好奇心。 - Cody GrayFALSE
在标准中未定义,只有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
在任何方面都不是特权符号。
TRUE
和FALSE
可以被定义(通常作为宏,有时作为枚举值),但是你不能依赖它。例如,在Linux上使用GCC编译器时,bool something = FALSE;
会产生编译时错误,因为FALSE
未定义。当FALSE
被定义时,通常会被定义为0
或false
- 但这不是你应该依赖的东西。请依赖于标准。 - Mattypedef int BOOL;"
或"typedef unsigned char BOOL;"
。这是从C语言中延续下来的,因为当时没有类型来表示布尔值。 - Thomas Matthews#define false true
,哇! - Thomas EdingFALSE
可能是一个布尔类型,但通常它是一个整数类型。您可以将其用作布尔值,但它仍然是整数型。这在模板推导和重载函数解析方面非常重要,例如,如果 FALSE
展开为 0
,则 f(false)
和 f(FALSE)
可以调用两个完全不同的函数。 - Dennis Zickefoosefalse
是 C++ 的一个关键字。
FALSE 在 C++ 标准中并未定义。但大多数编译器将 FALSE 定义为一个预处理宏,其值为 0。
只需记住真和假的布尔值始终代表什么。它们始终将是整数(0,1)。编译器可能无法识别,但它们始终会作为整数存储和通过CPU运行。调试器将显示此内容。无论它是否大写并不重要,因为在其实现或使用中不应有任何区别。如果您的编译器编写了一些支持大小写真和假的宏,那就太好了,但这只是为了适应您的需求。就像所有其他类型一样。
关于Windows API的重要说明:一些Windows库函数返回任意整数值,尽管返回类型被定义为BOOL
。最好永远不要将BOOL
与TRUE
进行比较。使用
bSomeVal != FALSE instead.
FALSE
是这样定义的:#define FALSE (0)
。 - John Diblingfalse
是编程语言的一部分。 - John Dibling