2011-04-14 989 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. 
相關問題