2009-05-06 113 views
19

在C++中何時應該使用BOOL和bool,爲什麼?在C++中應該何時使用BOOL和bool?

我認爲使用布爾更清潔,更便攜,因爲它是一個內置類型。但是當您與舊代碼/ C代碼交互時,或者使用C代碼/ Windows API從.NET進行內部操作時,BOOL是不可避免的。

所以我的政策是: 在C++中使用bool。 與外界交談時使用BOOL,例如windows DLL中的導出函數。

有什麼時候使用一個的確切解釋?

+2

對downvoters:爲什麼?如果你把這個問題投下來,留下評論 – 2009-05-06 15:15:20

+0

@詹姆斯:大概是因爲這個問題的結構是主觀的,從主觀的角度來看,這不是一個很好的問題。我試圖改寫它,所以它可能有更多的價值,但我懷疑它。 – Pesto 2009-05-06 15:17:38

+1

爲什麼倒票?這個不錯。 – 2009-05-06 15:19:32

回答

6

馬修·威爾森討論BOOLbool,並在Imperfect C++ 13.4.2節類似。混合兩者可能會有問題,因爲它們通常具有不同的大小(並且指針和引用不可互換),並且由於bool不保證具有任何特定大小。嘗試使用typedef或有條件compilating平滑過度BOOLbool或試圖允許一個單一的布爾類型在C和C++的工作之間的差異更是雪上加霜:

#if defined(__cplusplus) || \ 
    defined(bool) /* for C compilation with C99 bool (macro) */ 
typedef bool bool_t; 
#else 
typedef BOOL bool_t; 
#endif /* __cplusplus */ 

這種方法意味着函數的返回類型可以根據哪種語言調用它而有所不同; Wilson解釋說,他在自己的代碼中看到了不止一個錯誤,以及由此產生的其他錯誤。他得出結論:

這種不完美的解決方案,因爲它經常是禁慾。我從不使用 bool來處理可能通過多個鏈接單元(動態/靜態庫,提供的目標文件)訪問的任何內容,這基本上不包含在頭文件之外的功能或類中。實際的答案就是使用僞布爾類型,其大小爲 int

總之,他會同意你的方法。

2

您應該使用BOOL的另一種情況:在執行回調函數時使用或返回BOOL

例如,EnumWindows()採用指向回調函數具有以下簽名:

BOOL CALLBACK EnumWindowsProc(  
    HWND hwnd, 
    LPARAM lParam 
); 

如果使用bool對於這一點,你必須強制轉換的函數指針。

9

如果BOOL是某種整數類型,並且它一直是,並且BOOL被定義以便它工作正常,那麼標準轉換會自動得到它的正確性。你不能完全交替使用它們,但你可以靠近。

在界面上使用BOOL,在那裏你必須與Win32 API或其他任何對話。在其他地方使用bool。

-2

我認爲「真」/「真」和「假」/「假」作爲語法糖,解決了從未存在的問題。我一直認爲使用和閱讀「1」和「0」更容易。

當你想到寄存器中的標誌處於打開或關閉狀態時,你認爲在1s和0s還是trues和falses?如果你想在單個變量中存儲幾個標誌,會發生什麼? 1和0是通用的。

我認爲「false」這個詞對於自己來說太長了。當我看到一個「0」時,它在我的腦海中像紅色的停車標誌一樣突出。停止標誌是紅色的,因爲紅色會引起人們的注意。閱讀「假」這個詞就像看到一個綠色的停車標誌。

所以,地獄與布爾和布爾。我默認爲int。

...但是,真的,獲得布爾標誌正確的語言是最不用擔心的一種語言,有許多方法可以讓錯誤成爲C++。

1

如果您希望在託管程序(例如C#中)中使用用C++編寫的函數(例如嵌入在DLL庫中),則使用BOOL。如果你返回bool,結果將永遠是真的 - 這是已知的很長一段時間的錯誤,顯然還沒有解決(VS 2010,.NET Framework 4)。

此致敬禮 - Spook。