2009-05-02 27 views
3

我有一個使用兩個第三方庫的項目,這兩個庫都在其頭文件中使用TCHAR。不幸的是,一個庫被編譯爲多字節(稱爲庫a),另一個被編譯爲Unicode(稱爲庫b)。在具有不同字符集的庫的頭文件中處理TCHAR

現在我明白了,TCHAR被預編譯器替換爲wchar或char,具體取決於構建選項。因此,當編譯庫a時,任何需要使用TCHAR類型參數的方法都被設置爲期望char類型的參數,並且庫b中的方法被設置爲期望wchar類型的參數。

不幸的是我的消費應用程序也必須選擇一個字符集。如果我選擇Unicode,那麼我爲庫a包含的頭文件告訴我該方法需要一個wchar,因爲當我在頭中編譯TCHAR時,它們被解釋爲wchars。這包括在結構中定義的TCHARS。我已經在實踐中證實了這種行爲,當我分配並傳遞一個TCHAR緩衝區時,我返回垃圾,因爲它用多字節數據填充了我的wchar緩衝區。

我的問題是:在同一個應用程序中是否有一個乾淨的方式來使用這兩個庫?我可能在如何使用這些庫方面做錯了什麼?

回答

4

假設你沒有在這些庫中的任何一箇中使用太多的類/函數,我會完全包裝一個庫。假設您決定在您的應用程序中使用mbc幷包裝庫b(unicode),您的包裝頭文件可以使用wchar_t而不是TCHAR,因此#define不會影響您的界面。在您的包裝庫的cpp文件中,您包含庫b的頭文件,您需要#define TCHAR以匹配庫b。應該允許您的包裝以外的任何代碼查看庫b。

如果您在這兩個庫中使用了多個類/函數,維護包裝器代碼將很快成爲它自己的問題。

+0

感謝您的回答,那就是我傾向的方向。我要出去一趟,問問什麼可能是一個愚蠢的問題。使用包裝器與僅編輯庫的頭文件以使其與結構和導出函數的編譯定義相匹配的優點是什麼?我在想象這與大家一起搜索和替換TCHAR一樣簡單。我是否簡化了它? – MichaC 2009-05-02 05:28:15

0

我認爲你最好的選擇是選擇圖書館a或圖書館b(我們會說這個例子是圖書館a)的方式。然後,當你包含庫b頭文件時,確保#define /#undef庫b已被編譯。然後,您必須確保您在庫a和庫b之間進行轉換,只要他們使用相同的數據。

如果你能以相同的方式編譯它,那將是最好的。否則它會非常混亂。

1

由於建議使用Shing Yip,所以在您自己的API中更好地包裝差異。這使得你的源代碼獨立於它。

包裝API必須將字符從編碼轉換爲庫。在windows上,我有你的功能,叫做WideCharToMultiByte等等。

相關問題