2011-04-14 44 views
17

在很多程序中,我看到标识为FALSEfalse的语句。它们在C++的环境中有什么区别吗?我也看到了boolBOOL。这两者之间有什么区别?false和FALSE有什么区别?

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

+0

这是在Windows下吗?然后它是从C时间剩余的时间,它没有真正的布尔值,并且FALSE被定义为0. – RedX 2011-04-14 12:59:34

+0

@RedX:你的意思是FALSE由布尔值定义,那么假? – RidaSana 2011-04-14 13:00:58

+0

不,'FALSE'是这样定义的:'#define FALSE(0)' – 2011-04-14 13:33:59

回答

22

如果所包含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没有标准定义的布尔类型。相反,开发人员被迫定义自己的布尔常量。为了防止可能造成的混乱,微软决定使用所有Windows应用程序的标准。

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

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

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

+0

@cody:是的,我使用的是Window应用程序...所以我使用假和真..其与布尔类型的工作... – RidaSana 2011-04-14 13:16:57

+0

@Cody :关于bool和BOOL的问题的第二部分呢? – RidaSana 2011-04-14 13:21:29

+1

@小姐:我补充说,在我的答案更新。简单地说,'bool'是C++标准中定义的布尔类型。它适用于小写的'true'和'false'关键字。 'BOOL'是一个整数类型,由'windows.h'定义,设计用于处理大写的'TRUE'和'FALSE'。容易记住,因为这些情况与每个组匹配。 – 2011-04-14 13:23:01

13

FALSE未在标准中定义。只有false是。 truefalse被称为“Boolean litterals”(并且是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都不是特权符号。

+0

但FALSE和假返回0 ..这意味着两种类型都是bool ..右 – RidaSana 2011-04-14 13:07:42

+2

不在标准C++中。可以定义“TRUE”和“FALSE”(通常作为宏,有时也可以作为enum的值),但是你不能依赖它。以Linux上的'GCC'为例,'bool something = FALSE;'是编译时错误,因为未定义'FALSE'。当定义'FALSE'时,通常将其定义为'0'或'false' - 但这不是您应该依赖的。依靠标准。 – Mat 2011-04-14 13:09:40

+0

关于bool和BOOL的问题的第二部分呢? – RidaSana 2011-04-14 13:21:46

1

false是一个C++关键字。

FALSE不是由C++标准定义的。但大多数编译器有FALSE定义为具有值0

+0

你的意思是它已经预先定义为宏... – RidaSana 2011-04-14 13:02:45

+0

@Miss:'Predefined'?在大多数情况下,你将不得不#include一些头文件来获得#define。 – harper 2011-04-14 18:31:58

2
用C

++,预处理宏是一个内置在文字表示假值布尔类型(其他可能的值表示与该文字

FALSE是它的#define定义可能取决于平台,但通常为0

+0

表示false和FALSE都是布尔类型... FALSE表示0,但false也应该为0,因为它的布尔类型.. ..is't – RidaSana 2011-04-14 13:05:14

+1

false不计算为0,但强制为0(或者如果您愿意,则转换为int,例如当int被隐式转换为浮点数时)。预处理器将FALSE重写为0。请注意,FALSE也可能由false定义,这取决于平台。 – 2011-04-14 13:19:29

+1

@Miss:不,'FALSE'可能是一个布尔类型,但通常它是一个整型。您可以将它用作布尔值,但它仍然是不可或缺的。例如,当涉及模板演绎和重载函数解析时,这非常重要。如果FALSE扩展为0,'f(false)'和'f(FALSE)'可以调用两个完全不同的函数。 – 2011-04-14 13:19:59

0

不要使用FALSE。正如其他人所说的那样,这是一个对0进行宏观评估的结果。我听说过有人离开公司并将(#define FALSE 1)随机放置在代码库中的故事。一个肯定的方式来肆虐。因为它是C++标准的一部分,所以坚持使用false

+0

好像很容易固定,如果你原来的定义包括'的#ifdef FALSE和#undef FALSE' – 2011-04-14 13:16:14

1

只要记住布尔真正意义上的真假。他们总是会是整数(0,1)。编译器可能无法识别它,但它们将始终作为整数存储并通过CPU运行。调试器将显示这一点。它是否处于上限并不重要,因为它的实施或使用应该没有什么不同。如果你的编译器有一些宏写成既支持大小写又支持真假,那么很好,但它只是为了满足你的需求。就像所有其他类型一样。

0

有关Windows API的重要说明:尽管返回类型定义为BOOL,但某些WIndows库函数会返回任意整数值。最好不要将BOOLTRUE进行比较。使用

bSomeVal != FALSE instead. 
相关问题