使用多个外部库时如何避免"redefinitions"?

How to avoid "redefinitions" when using multiple external libraries?

本文关键字:何避免 redefinitions 外部      更新时间:2023-10-16

我有两个库(第三方),并且在每个库中都定义了两个具有相同名称的类(在头文件中)。

// 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的库,除非您提供给它们一个。

创建第三个标题,移动冗余定义(只有一次);然后将这个标题包含到原始文件中。