2008-10-10 74 views
5

我試圖將一箇舊庫(儘可能不使用名稱空間)移植到現代編譯器中。我的一個目標無法區分System :: TObject和:: TObject(沒有命名空間)。 System :: TObject是編譯器原生的。如何在移植舊代碼時處理類名衝突?

我試過使用指令,即使用:: TObject;

但是,這並沒有做到這一點。

顯而易見的解決方案是將所有原始庫封裝在一個名稱空間中,然後通過名稱來調用它 - 這應該避免含糊不清。但是,這是最明智的解決方案嗎?還有其他解決方案嗎?添加一個命名空間需要更改一堆文件,我不知道它是否會在稍後產生不必要的影響。

回答

0

如果你有源庫,也許包括在每個源的頂部的頭文件頭文件中有隻有:

#define TObject TMadeUpNameObject 
0

試試這個:

namespace oldlib 
{ 
    #inclcude "oldlib.h" 
}; 
+0

這將導致編譯器創建以oldlib爲前綴的符號,該符號不會出現在舊庫中,從而導致「未解析的外部符號」public:__thiscall oldlib :: A ::〜A(void)「(? ?1A @ oldlib @@ QAE @ XZ)` – xtofl 2008-10-10 09:33:39

1

你可以爲所有舊功能打包,並將它們打包成DLL或靜態庫。

0

我已經在過去使用以下,而封裝包含類的代碼相沖突的第三方頭文件:

#ifdef Symbol 
#undef Symbol 
#define Symbol ThirdPartySymbol 
#endif 
#include <third_party_header.h> 
#undef Symbol 

這樣一來,「符號」中的頭球被第三方前綴,這是不與我的代碼碰撞。

3

你可以做迪布建議,有輕微的修改:

// In a wrapper header, eg: include_oldlib.h... 

namespace oldlib 
{ 
    #include "oldlib.h" 
}; 

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE 
using namespace oldlib; 
#endif 

這可以讓你在#定義只有文件排除在那裏你得到衝突,並使用所有的符號爲全局符號除此以外。