如何在移植旧代码时处理类名冲突

How to handle a class name conflict when porting old code?

本文关键字:处理 冲突 代码      更新时间:2023-10-16

我正试图将一个旧库(据我所知,它不使用名称空间)移植到现代编译器。我的一个目标无法区分System::TObject和::TOobject(没有命名空间)。System::TObject是编译器的本机对象。

我尝试了一个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

这允许您仅在发生冲突的文件中#定义排除,否则将所有符号用作全局符号。

您可以为所有旧函数制作一个包装器,并将它们打包到DLL或静态库中。

如果您有库的源,可以在每个源的顶部包含一个头文件,其中该头文件只有:

#define TObject TMadeUpNameObject

试试这个:

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

我过去在封装包含与代码冲突的类的第三方头文件时使用过以下内容:

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

这样,头中的"Symbol"前缀是ThirdParty,这与我的代码没有冲突。