如何解决两个不使用命名空间的第三方库之间的类名冲突?

How to resolve class-name conflicts between two third-party libraries that do not use namespaces?

本文关键字:第三方 之间 命名空间 冲突 解决 何解决 两个      更新时间:2023-10-16

我的项目使用两个第三方开源库,两个库都定义了类型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 链接

由于这些库是开源的,因此您可以向其中至少一个库添加一个命名空间,并将您的补丁提供给库维护者。

您将实现两件事:

  1. 修复您的特定命名冲突,以及
  2. 让世界变得更美好。