2010-08-20 61 views
13

我已經寫了一個C的數據結構和函數的集合,其中一些使用_Bool數據類型。當我開始的時候,這個項目將變成純粹的C.現在我正在研究使用一個基於C++的GUI工具包,並將後端代碼放到一個庫中。_Bool和bool:我如何解決使用_Bool的C庫的問題?

然而,編譯的C++ GUI時以下錯誤是由編譯器所發射:

ISO C++ forbids declaration of '_Bool' with no type

我最初以爲我可以搜索&替換_Boolbool並創建:

/* mybool.h */ 
#ifndef MYBOOL_H 
#define MYBOOL_H 

typedef _Bool bool; 

#endif /* MYBOOL_H */ 

然後在任何使用_Bool

#ifdef __cplusplus 
extern "C" { 
#else 
#include "mybool.h" 
#endif 

/* rest of header... */ 

直到我意識到這將編譯一個布爾(C _Bool)數據類型的庫,並使用另一個(C++布爾)鏈接庫。實際上,這可能並不重要,但從理論上講,它可能確實存在(可能會有一些不太明確的系統,這樣做會導致宇宙內部出現)。

我想我可以只使用一個int,並使用0作爲false,使用1作爲true,並使用類似於typedef int mybool的typedef,但它看起來沒有吸引力。

有沒有更好的/慣用的/標準的方式來做到這一點?

+1

做出該評論的答案,'布爾'是如何'_Bool'是如何正常使用。 – 2010-08-20 10:12:11

+1

所以我不需要擔心宇宙內外翻轉? – 2010-08-20 10:41:21

回答

5

笨蛋!只需#include <stdbool.h>並使用bool

+5

啞巴屁股:(形容詞)非常不智能。 (連字符,見「屁股」)。你的意思是說,相比之下,你更聰明,因爲你知道應該包括#include 在C中使用bool。我不敢說我​​對你的答案的看法。 – 2010-08-20 10:40:45

+9

爲什麼是的,與我笨拙的自我形成對比,當然我更聰明。 – 2010-08-20 10:58:35

+0

接受我自己的回答,並決定自稱爲傻瓜(因爲在**在stackoverflow.com上提問時沒有意識到答案**)。 – 2010-08-24 07:11:48

-4

對於您的C和C++代碼都使用typedef int _Bool。如果將_Bool定義爲其他任何內容,我會感到驚訝。

+8

_Bool是C99本機類型。 – 2010-08-20 10:02:49

+0

因此你不能。 – 2010-08-20 10:10:12

+1

@JamesMorris:它不僅是本機類型,它的名稱是一個關鍵字(假設C編譯器支持C99或更高版本)。 – 2013-06-07 01:27:37

11

如果C和C++編譯器使用的是來自同一個供應商的話,我會想到的C _Bool是同一類型,C++ bool,這包括<stdbool.h>將使一切很好地互操作。如果他們來自不同的供應商,那麼您需要檢查兼容性。

請注意,您始終可以在頭中測試__cplusplus宏,以確定代碼是否正在編譯爲C++,並且適當地設置類型。

+0

我總是可以在我的頭文件中測試__cplusplus宏......嗯,好吧,發現了。 – 2010-08-24 07:08:16

+0

http://stackoverflow.com/questions/25461/interfacing-with-stdbool-hc是一個他們不兼容的例子,雖然這個問題存在一個不好的非編譯器提供的'stdbool.h'頭。 – 2013-01-06 04:32:59

1

我認爲必須在任何項目中使用bool,以便與C++兼容(如果需要)。

C99中的數據類型_Bool的存在是爲了避免與標準C99之前可能已經定義的程序員可能存在的版本bool衝突。因此,程序員可以選擇更好的方法來調整其舊C程序以遷移到新標準。 因此,我認爲使用單詞bool是C99標準化委員會的真正願望,但它被迫通過定義醜陋的詞_Bool來包圍不兼容性問題。 這表明程序員可能不得不在他/她的項目中使用「預期的」單詞bool。在程序中聲明布爾類型是最合乎邏輯的詞。

在某些情況下,保留程序員預先定義的bool可能是個好主意,在其他情況下,最好使用<stdbool.h>中定義的bool版本。 程序員必須決定在每種情況下哪種更好,並且可能要考慮是否逐步遷移到<stdbool.h>是一個很好的操作。

如果您從零開始項目,那麼可能最好的方法是使用<stdbool.h>中定義的bool

3

形式上,這個問題沒有解決方案。類型_Bool僅在C中存在。C++語言不提供任何類型,以確保與_Bool的二進制兼容性。不保證C++ bool兼容。

適當的解決方案是不要在C函數的參數聲明中使用bool_Bool,這些C函數的參數聲明可以直接從C++代碼訪問(即可鏈接)。使用int,char或任何其他確保兼容的類型。

+2

我懷疑'int'或'char' _guaranteed_在C和C++之間是兼容的。可以說在編譯器的文檔中是正確的,但總的來說這個斷言是錯誤的。如果文檔說明兼容'int's,我不明白爲什麼它不應該說'bool'。 – magras 2016-07-26 12:22:12