所以我正在將應用程序的體系結構升級到更模塊化的設計。這是一個C++應用程序,如果我們正在爲特定目標構建,則使用底層整體c-library,否則它會使用不同的庫後端。C++靜態庫依賴項,頭包括頭文件
當前應用程序的前端代碼,GUI代碼,直接綁定到單片c庫,它只能在一個目標上工作。已經完成的是單片C庫已經被放入一個「模塊」中,該模塊公開了應用程序GUI部分使用的通用C++接口。這樣我們可以更改構建目標,並且GUI代碼不會更改。以前現有的GUI代碼使用C庫中定義的結構,這對所有可能的C庫都是通用的。
的C++模塊內部,我定義它看起來像這樣的代理類型排序的:
//ModuleTypes.hpp
typedef CPP_TYPE C_LEGACY_TYPE;
和GUI代碼只需使用就地先前存在C_LEGACY_TYPE的CPP_TYPE。
在亞洲其他模塊項目,Module.hpp樣子:
//Module.hpp
#include "C_LEGACY_TYPES.hpp"
...
#include "ModuleTypes.hpp"
所以當C++模塊被編譯成一個靜態庫,Module.hpp包括C_LEGACY_TYPES.hpp ModuleTypes.hpp之前(這樣ModuleTypes。 hpp知道C_LEGACY_TYPE是什麼), 和靜態庫編譯就好了。
的問題是GUI模塊中,其中,例如:
//Gui1.hpp
class Gui1 {
void Method1(CPP_TYPE value);
};
由於CPP_TYPE不能向前聲明,在上面我加的#include「ModuleTypes.hpp」到Gui1.hpp。
//Gui1.hpp
#include "ModuleTypes.hpp"
class Gui1 {
void Method1(CPP_TYPE value);
};
當我去編譯GUI模塊時,它會出錯,因爲它找不到C_LEGACY_TYPE是什麼。解決這個問題的唯一方法是在ModuleTypes.hpp中#include「C_LEGACY_TYPE.hpp」。然而,這導致GUI必須知道傳統C頭文件在編譯時的位置。
我想GUI.hpp #include「ModuleTypes.hpp」,但從靜態庫中使用C_LEGACY_TYPE的定義,而不必在#「ModuleTypes.hpp」中包含「C_LEGACY_TYPES.h」。
我明白爲什麼發生錯誤,我在尋找替代解決方案。如何讓GUI模塊能夠使用ModuleTypes.hpp中的類型定義,而無需在編譯GUI模塊時包含傳統標頭?
隨着體系結構的變化,我們正在遷移C++ 11,所以我願意接受任何建議。 VC2010是我們正在建設的。