我正在尝试将一个旧库(尽管我没有使用名称空间)移植到现代编译器中。我的一个目标无法区分System :: TObject和:: TObject(没有命名空间)。 System :: TObject是编译器的原生。
我尝试了一个using指令,即使用:: TObject;
但那不行。
显而易见的解决方案是将所有原始库包装在命名空间中,然后通过名称调用它 - 这应该避免歧义。但这是最明智的解决方案吗?还有其他解决方案吗?添加命名空间需要更改一堆文件,我不知道以后是否会产生不必要的后果。
答案 0 :(得分:3)
您可以像Dib建议的那样做,稍作修改:
// In a wrapper header, eg: include_oldlib.h...
namespace oldlib
{
#include "oldlib.h"
};
#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif
这允许您#define仅在您遇到冲突的文件中排除,否则使用所有符号作为全局符号。
答案 1 :(得分:1)
您可以为所有旧函数创建一个包装器,并将它们打包到DLL或静态库中。
答案 2 :(得分:0)
如果您拥有该库的源代码,可能在该头文件所在的每个源的顶部都包含一个头文件:
#define TObject TMadeUpNameObject
答案 3 :(得分:0)
试试这个:
namespace oldlib
{
#inclcude "oldlib.h"
};
答案 4 :(得分:0)
我在过去使用了以下内容,同时封装了包含与代码冲突的类的第三方头文件:
#ifdef Symbol
#undef Symbol
#define Symbol ThirdPartySymbol
#endif
#include <third_party_header.h>
#undef Symbol
这样,标题中的“符号”以ThirdParty为前缀,这与我的代码没有冲突。