2008-10-10 80 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 

这可以让你在#定义只有文件排除在那里你得到冲突,并使用所有的符号为全局符号除此以外。