2011-04-25 89 views
2

我有兩個庫(第三方),並在每個這些庫中定義了兩個具有相同名稱的類(在頭文件中)。如何避免使用多個外部庫時的「重新定義」?

// Lib A, HeaderA.h 
struct mycompare 
{ 
//Some code 
}; 

// Lib B, HeaderB.h 
struct mycompare 
{ 
//Same code 
}; 

請注意,在這兩個庫,mycompare名稱和實現相同。如何同時使用兩個頭文件?

回答

5

假設你不能編輯頁眉/庫:

  • 間接:創建自己亂行包裝爲A和B的簡單,它包括HeaderA.h或HeaderB.h只在執行中。
    • 這類似於但比阿爾斯的選擇要少得多的工作和偶合器2 ;-)
  • 無恥兩輪牛車:包括HeaderA.h,然後#define mycompare mycompare_duplicate包括HeaderB.h,然後#undef mycompare之前。如果其中一個實現稍後發生變化,這可能會讓你感到痛苦,如果頭稍後使用該符號本身(例如,作爲函數參數,其中類型名稱mangling會有所不同並且阻止您的調用被解析),則可能無法實現。

如果您可以編輯這些庫,那麼顯然最好的長期選擇是將它們的功能放入不同的名稱空間中。

1

一個快速的解決方法是簡單地將它們包裝在名稱空間中。這可能很簡單,取決於標題的複雜程度。或者,考慮使用這個特定的結構編寫自己的頭文件(如果你知道它將保持不變),並在傳遞給每個結構時進行強制轉換。

也就是說,這種情況非常不典型。你確定圖書館B不依賴於A,反之亦然?在這種情況下,唯一可能被破壞的是一些#define USE_EXTERNAL_A左右。一個典型的例子是包含zlib的庫,除非您提供它們。

+0

庫實際上並不相關。 :) – Morpheus 2011-04-25 06:48:40

1

只需製作第三個標題,移動冗餘定義(僅限一次);然後將此標題包含在原件中。它應該工作。

相關問題