c++ - 如何解决两个不使用命名空间的第三方库之间的类名冲突?
问题描述
我的项目使用了两个第三方开源库,两个库都定义了 type BDD
,并且都不使用命名空间。
有没有办法解决名称冲突?也许强制一个库进入自定义命名空间?
附加信息:第一个库BDD
仅用作类型别名 ( typedef int BDD
),因此它不调用任何方法BDD
。
解决方案
由于您的一个库仅用BDD
作的别名int
(我假设这个库被称为lib1
,而另一个lib2
),您可以通过告诉预处理器在包含库之前重命名它来更改此别名的名称,如下所示:
#define BDD BDD_lib1
#include <lib1>
#undef BDD
#include <lib2>
如果您需要在代码中使用该名称BDD
,lib1
则可以使用BDD_lib1
(或者int
如果您不担心其类型会在未来版本中更改lib1
)来引用它。
但是,我认为这种方法只是一种解决方法,而不是真正的解决方案,因此您可能需要考虑按照@YSC 在他的回答中建议的那样做,并提供一个补丁,这样其他尝试使用这些库的人就不会遇到同样的问题.
这在更一般的情况下是否有效?
ifBDD
不仅仅是一个简单的类型别名,而是一个单独的类,由于 C++ 的名称修饰,可能会遇到麻烦,因此此方法仅在名称BDD
不重要的情况下才有效,在出现名称修饰的任何情况下。这或多或少地施加了以下限制:
BDD
不能有任何非内联方法- 任何依赖于的类型
BDD
(例如A<BDD>
类模板的特化template <typename> class A;
是依赖于`BDD的类型)不能有任何非内联方法 - 其参数列表包含类型的所有函数/方法
BDD
必须是内联的,或者具有 C 链接
推荐阅读
- ssh - ssh config - 将选定的密钥发送给代理
- excel - 有没有办法让 VBA Power 查询刷新更快?
- android - 使用带有 Navigation Jetpack 的查询参数的深层链接时保留特殊字符
- http - 在 Netlify 上部署网站后,来自 newsapi.org 的错误 426
- docker - “/bin/sh: [/bin/sh,: not found” 启动 kilna/liquibase-postgres 时的响应
- oracle - Oracle 分区建议
- aws-lambda - 将生成的 lambda 端点用于静态 javascript 代码的无服务器最佳方式
- c - 将 clang 更改为在 C11 或更高版本中编译?
- javascript - 在 Wagtail 导航栏上显示活动选择时出现问题
- java - 尝试在空对象引用上调用虚拟方法 'android.view.View android.widget.ImageView.findViewById(int)'