2014-02-18 53 views
8

我搜索了前向聲明,並沒有看到任何讓我的情況有效的方法。所以在這裏,它是:正向聲明在C++中定義的枚舉C

1)有一個C-頭文件,導出接口,從而爲大型多組件軟件說話,包含的typedef

「export.h枚舉「:

// This is in "C"! 
typedef enum _VM_TYPE {...., ...., ...,} VM_TYPE; 

2)代碼的一部分,在C++,使用該出口。

「cpp_code.cpp」:

// This is in C++ 
#include "export.h" 
#include "cpp_header.hpp" 
{ .... using VM_TYPE values to do stuffs....} 

「cpp_header.hpp」:

// Need to somehow forward declear VM_TYPE here but how? 
Struct VM_INFO { 
.... 
VM_TYPE VType; //I need to add this enum to the struct 
.... 
}; 

所以很明顯,問題是出在cpp_head.hpp,因爲它不知道的枚舉。

我嘗試添加到cpp_header.hpp

typedef enum _VM_TYPE VM_TYPE; 

,它會實際工作。 那麼爲什麼這個工作?因爲它有C風格的語法?! 無論如何,我被告知不要這樣做(「這是C++,而不是C」),由上層的「管理層」來完成。

根據目前的情況,有沒有其他方法可以完成這項工作?他們不想更改/添加包含文件; 「枚舉類」只是C++,正確嗎?在cpp_header.hpp中添加「枚舉VM_TYPE」會導致重定義錯誤。

有什麼想法?謝謝。

+1

http://stackoverflow.com/questions/71416/forward-declaring-an-enum-in-c – alexbuisson

+0

任何不包括export.h在cpp_header的原因?無論如何,它似乎依賴於枚舉。除非您使用指針/引用,否則您無法使用類/結構來完成此操作。 – imreal

+0

@alexbuisson我已經閱讀了該線程。我明白爲什麼前向聲明不能在C++(基礎類型)中工作,但不知道我的情況是否有任何解決方法。 – Andrew

回答

1

在你的問題中描述的特定情況下,你不需要轉發聲明的。你所有的文件#include將基本上覆制粘貼到一個單一的翻譯單位編譯正確的開始之前,因爲你#include "export.h"之前#include "cpp_header.hpp",那麼它只會工作,因爲在編譯器看到的定義struct VM_INFO,它已經看到了enum _VM_TYPE的定義,所以你沒有問題。在"cpp_header.hpp"之間包括"export.h",並且按順序在"cpp_code.cpp"中包括它們,因爲在預處理之後最終會得到基本相同的代碼,所以基本上沒有區別。所以你所要做的就是確保你按照正確的順序得到你的包裝。

如果你想#include "cpp_header.hpp"沒有包括在您需要訪問的struct VM_INFO成員(以便把它當作一個不完整的類型不是一個選項),然後"export.h"只是設計糟糕的翻譯單元"export.h",你應該將你可能需要的任何東西的定義分解成一個新的頭文件。如果正如評論所暗示的那樣,你完全無法做到這一點,並且需要設計一個不理想的設計,那麼你的下一個最佳選擇將是有兩個版本的"cpp_header.hpp",一個只是重複enum _VM_TYPE的定義,而另一個則沒有。你會在任何翻譯單元的第一個版本而不是#include "export.h"#include第二個版本在你所在的任何翻譯單位。很明顯,這種類型的代碼重複將來會引發問題。

另外,以下劃線和大寫字母開頭的名字總是保留在C中,所以你真的不應該使用它們。如果未來的C版本決定使用_VM_TYPE,那麼你會被卡在使用過時版本的C,或者所有代碼都被破壞。

+0

好吧,看起來#includes訂單不是我想象/發佈的。不太簡化的代碼是'#include「someother.hpp」\\,其中包括「export.h」,然後是「#include」cpp_header.hpp「'。問題是''someother.hpp''還包括'cpp_header.hpp'之前的''export.h「'...所以順序是顛倒的。必須查看是否可以在不破壞任何現有代碼的情況下進行更改... – Andrew

+0

您的想法應該從我最初發布的內容開始。不幸的是,還有其他部分失敗......即該組件內的其他文件,其中只包含'cpp_header.hpp',而不包含'export.h'。因此編譯所有這些文件時'VM_TYPE'是未定義的。 – Andrew

+0

然後你需要重新設計。簡單而明顯的答案就是通過包含''export.h'''或​​從''cpp_header.hpp''中刪除'struct'定義來反映你如何使用它們的內容來編寫/修改你的頭文件。 '並把它放在一個單獨的標題中。如果出於某種神祕的原因,只有您的僱主才知道您不允許正確書寫C,那麼您要麼按照答案中提供的方式需要某種重複的解決方法,要麼您需要放棄您的計劃僱主顯然不希望根據他們的設計。 –

0

枚舉不能轉發聲明,因爲編譯器需要知道枚舉的大小。底層枚舉器是編譯器特定的,但通常是int。你可以將枚舉拋出int嗎?

「我可能是和經常是錯的」