false和FALSE有什么区别?

时间:2011-04-14 12:58:08

标签: c++ windows boolean

在许多程序中,我看到带有标识符FALSEfalse的语句。在C ++的上下文中它们之间有什么区别吗?

同样在某些程序中,我看到bool和某处BOOL。这两者有什么区别?

有人可以向我解释这些标识符之间的区别吗?感谢。

6 个答案:

答案 0 :(得分:24)

如果您已包含windows.h,那么FALSE #defined为0. TRUE #defined为1. 布尔类型,它是一个整数类型。 Windows还定义了类型BOOL,它实际上是一个整数类型,旨在容纳值TRUEFALSE

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应用程序,则可能仍需要使用TRUEFALSE标识符。 windows.h中定义的几个函数接受布尔参数(实际上是整数!),键入为BOOL或返回此类型的值。强类型的C ++如果将这些强制转换为语言标准中定义的布尔类型,可能会抱怨。为了保持一致性,我在所有对Windows API函数的调用中都使用了旧标识符,现在我自己编写的所有方法中都使用了标准定义的truefalse关键字。

确实没有理由不使用FALSE中定义的windows.h。但是你不应该像其他人提到的那样在专有头文件中自己定义它,因为不能保证定义会随着时间的推移保持不变。这可能会导致一些非常愚蠢的错误,这种类型有资格出现在Daily WTF上。

Mat's answer 100%正确,{C}或C ++标准未定义TRUEFALSE。但是,它们 是由Windows API严格定义的,并保证不会更改。使用它们不会产生真正的跨平台,严格符合标准的C ++代码,但在编写Windows应用程序时这很少是一个问题,因为它们都不会调用windows.h中的任何其他函数。

答案 1 :(得分:14)

FALSE未在标准中定义。只有falsetruefalse被称为“布尔文字”,是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 1FALSE不是任何特权符号。

答案 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库函数会返回任意整数值。最好永远不要将BOOLTRUE进行比较。使用

  bSomeVal != FALSE instead.