使用多个外部库时如何避免"redefinitions"?
How to avoid "redefinitions" when using multiple external libraries?
我有两个库(第三方),并且在每个库中都定义了两个具有相同名称的类(在头文件中)。
// Lib A, HeaderA.h
struct mycompare
{
//Some code
};
// Lib B, HeaderB.h
struct mycompare
{
//Same code
};
请注意,在两个库中,mycompare的名称和实现都是相同的。如何同时使用两个头文件?
假设你不能编辑头文件/库文件:
- indirection:为更简单的A和B创建自己的脱行包装器,其中仅在实现中包含HeaderA.h或HeaderB.h。
- 这与Als的选项2类似,但工作和耦合要少得多;-)
- 无耻的黑客行为:先包括HeaderA.h,然后是
#define mycompare mycompare_duplicate
,再包括HeaderB.h,然后是#undef mycompare
。如果其中一个实现后来发生了变化,这可能会给你带来麻烦,如果头文件后来使用了符号本身(例如,作为函数参数,类型名称混淆会有所不同,并阻止你的调用被解析),这可能就不可能了。
如果可以编辑库,那么显然最好的长期选择是将它们的功能放在单独的命名空间中。
一个快速的解决方法是简单地将它们包装在一个名称空间中。这可能很简单,取决于头文件有多复杂。或者,考虑使用这个特定的结构体编写自己的头(如果您知道它将保持不变),并在传递给每个结构体时进行强制转换。
也就是说,这种情况非常不典型。你确定库B不依赖于库A,反之亦然吗?在这种情况下,唯一可能被打破的是一些#define USE_EXTERNAL_A
左右。一个典型的例子是包含zlib的库,除非您提供给它们一个。
创建第三个标题,移动冗余定义(只有一次);然后将这个标题包含到原始文件中。
相关文章:
- C++避免重复声明的语法是什么
- 在没有太多条件句的情况下,我如何避免被零除
- 如何重构类层次结构以避免菱形问题
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 以下示例中如何避免代码复制?C++/库达
- Python中的for循环与C++有何不同
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 是否应该在模板化代码中完全避免const
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 避免在C++中重复子类定义
- "Inverse SFINAE"避免模棱两可的过载
- 如何避免在仅标头库中C++类/变量重定义
- Python 集合.计数器,如何避免重复查找
- 是否应避免从非常量迭代器转换为常量迭代器?
- 避免矢量中的对象切片<Base><shared_ptr>
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何避免LED在循环状态变化中闪烁?