我正在尝试将旧库(据我所知不使用名称空间)移植到现代编译器。我的目标之一无法区分 System::TObject 和 ::TObject (没有命名空间)。System::TObject 是编译器原生的。
我尝试了一个 using 指令,即 using ::TObject;
但这并没有。
显而易见的解决方案是将所有原始库包装在名称空间中,然后按名称调用它——这应该避免歧义。但这是最明智的解决方案吗?还有其他解决方案吗?添加命名空间需要更改一堆文件,我不知道以后是否会产生不必要的影响。
我正在尝试将旧库(据我所知不使用名称空间)移植到现代编译器。我的目标之一无法区分 System::TObject 和 ::TObject (没有命名空间)。System::TObject 是编译器原生的。
我尝试了一个 using 指令,即 using ::TObject;
但这并没有。
显而易见的解决方案是将所有原始库包装在名称空间中,然后按名称调用它——这应该避免歧义。但这是最明智的解决方案吗?还有其他解决方案吗?添加命名空间需要更改一堆文件,我不知道以后是否会产生不必要的影响。
您可以按照 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 排除,否则将所有符号用作全局符号。
您可以为所有旧函数制作一个包装器,并将它们打包到一个 DLL 或静态库中。
如果您有库的源代码,则可能在每个源代码的顶部包含一个头文件,其中该头文件只有:
#define TObject TMadeUpNameObject
尝试这个:
namespace oldlib
{
#inclcude "oldlib.h"
};
我过去在封装包含与代码冲突的类的第三方头文件时使用了以下内容:
#ifdef Symbol
#undef Symbol
#define Symbol ThirdPartySymbol
#endif
#include <third_party_header.h>
#undef Symbol
这样,标题中的“符号”以 ThirdParty 为前缀,这与我的代码没有冲突。