如何解决两个不使用命名空间的第三方库之间的类名冲突?
How to resolve class-name conflicts between two third-party libraries that do not use namespaces?
我的项目使用两个第三方开源库,两个库都定义了类型BDD
,并且都不使用命名空间。
有没有办法解决名称冲突?也许强制一个库进入自定义命名空间?
附加信息: 第一个库仅使用BDD
作为类型别名 (typedef int BDD
(,因此它不会在BDD
上调用任何方法。
由于您的一个库仅使用BDD
作为int
的别名(我假设这个库称为lib1
,而另一个lib2
(,您可以通过告诉预处理器在包含库之前重命名它来更改此别名的名称,如下所示:
#define BDD BDD_lib1
#include <lib1>
#undef BDD
#include <lib2>
如果需要在代码中使用名称BDD
来自lib1
,则可以使用BDD_lib1
引用它(或者如果您不担心其类型会在lib1
的未来版本中更改,则仅使用int
引用它(。
但是,我认为这种方法只是一种解决方法,而不是真正的解决方案,因此您可能需要考虑按照他的回答中@YSC建议进行操作并提供一个补丁,以便其他尝试使用这些库的人不会遇到同样的问题。
这在更一般的情况下是否有效?
如果BDD
不仅仅是一个简单的类型别名,而是一个单独的类,则可能会由于C++的名称重整而遇到麻烦,因此此方法仅在名称BDD
在任何出现名称重整的情况下都不重要时才有效。这或多或少施加了以下限制:
BDD
不得有任何非内联方法- 任何依赖于
BDD
的类型(例如,类模板的专用化A<BDD>
template <typename> class A;
是依赖于"BDD"的类型(不得有任何非内联方法 - 参数列表包含取决于
BDD
类型的所有函数/方法都必须是内联的,或者具有 C 链接
由于这些库是开源的,因此您可以向其中至少一个库添加一个命名空间,并将您的补丁提供给库维护者。
您将实现两件事:
- 修复您的特定命名冲突,以及
- 让世界变得更美好。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 如何解决两个不使用命名空间的第三方库之间的类名冲突?