false和FALSE有什么区别?

Rid*_*ana 22 c++ windows boolean

在许多程序中,我看到带有标识符FALSE和语句的语句false.它们在C++环境中有什么区别吗?

在某些程序中,我看到了bool某个地方BOOL.这两者有什么区别?

任何人都可以向我解释这些标识符之间的区别吗?谢谢.

Cod*_*ray 25

如果你已经包含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;
Run Code Online (Sandbox Code Playgroud)

Windows最初是用C语言编写的,与所有原始Windows应用程序一样.那时,C没有标准定义的布尔类型.相反,开发人员被迫定义自己的布尔常量.为了防止可能造成的混乱,Microsoft决定采用可用于所有Windows应用程序的标准.

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

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

垫的回答是100%正确的,无论TRUEFALSE由C或C++标准中定义.然而,他们严格由Windows API定义,并且保证不会改变.使用它们不会产生真正的跨平台,严格符合标准的C++代码,但在编写Windows应用程序时这很少是一个问题,因为它们都不会调用任何其他函数windows.h.


Mat*_*Mat 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;
}
Run Code Online (Sandbox Code Playgroud)

它将0 1按预期打印.FALSE在任何方面都不是特权符号.

  • 不是标准的C++.可以定义`TRUE`和`FALSE`(通常作为宏,有时作为`enum`值),但你不能依赖它.以Linux上的`GCC`为例,`bool something = FALSE;`是编译时错误,因为没有定义`FALSE`.当定义"FALSE"时,它通常被定义为"0"或"假" - 但这不是你应该依赖的东西.依靠标准. (2认同)