2012-07-12 157 views
0

所以我正在將應用程序的體系結構升級到更模塊化的設計。這是一個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是我們正在建設的。

回答

3

通過在通用接口層(包裝類)後面分離後端C庫來做正確的事情,因此您可以稍後用其他方式輕鬆替換後端。

但是,您還需要確保封裝類中類似地隔離C庫接口中使用的類型。由於你的GUI層需要包含C_LEGACY_TYPE.hpp頭文件,我懷疑你的類型沒有被隔離,因爲它們應該是。

這可能意味着您需要在包裝類內部進行一些類型轉換,以便從GUI知道的類型轉換爲C庫使用的類型。包裝類(即公共接口)的接口不得包含任何特定於後端C庫的類型。