如何在移植旧代码时处理类名冲突
How to handle a class name conflict when porting old code?
我正试图将一个旧库(据我所知,它不使用名称空间)移植到现代编译器。我的一个目标无法区分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,这与我的代码没有冲突。
相关文章:
- 如何处理冲突的函数和变量名称?
- 为合约指定冲突处理程序
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 引发未经处理的异常:写入访问冲突. bunnies_array 0x5CB3CBA
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- 如何处理标头名称与标准库标头冲突,但不更改文件名?
- 是否有具有用户定义的冲突处理程序的 std::唯一样式库算法
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- 接收不一致的访问冲突,处理队列
- 引发未经处理的异常:读取访问冲突。这>字符串被0x1C6F112
- 视觉C++ Battle4锡安项目 引发未处理的异常:读取访问冲突.**这**是空的.发生
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- ***读取位置*******的访问冲突处出现未处理的异常
- 未处理的异常..访问冲突写入位置
- 在 DirectXGame.exe 中0x00B84CD6出现未经处理的异常:0xC0000005:访问冲突读取位置0x
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 并行处理冲突对
- std::unordered_map如何处理冲突
- 在c++中使用unordered_map实现哈希表并处理冲突