使用多个外部库时如何避免“重新定义”?

时间:2011-04-25 06:41:03

标签: c++

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

// Lib A, HeaderA.h
struct mycompare
{
//Some code
};

// Lib B, HeaderB.h
struct mycompare
{
//Same code
};

请注意,在两个库中,mycompare名称和实现相同。如何同时使用两个头文件?

3 个答案:

答案 0 :(得分:5)

假设您无法编辑标题/库:

  • 间接:为A和B的简单创建自己的外包装包装,只在实现中包含HeaderA.h或HeaderB.h。
    • 这与Als的选项2相似但工作和耦合要少得多; - )
  • 无耻的hackery:在包含HeaderB.h之前包含HeaderA.h,然后是#define mycompare mycompare_duplicate,然后是#undef mycompare。如果其中一个实现稍后更改,这可能会让您感到困惑,如果标头稍后使用符号本身(例如,作为函数参数,其中类型名称 - 修改将不同并阻止您的调用被解析)可能无法实现。

如果你可以编辑库,那么显然最好的长期选择是将它们的功能放在不同的命名空间中。

答案 1 :(得分:1)

快速解决方法是将它们简单地包装在命名空间中。这可能很简单,具体取决于标头的复杂程度。或者,考虑用这个特定的结构编写自己的标题(如果你知道它将保持不变)并在传递给每个结构时进行转换。

那就是说,这种情况非常不典型。你确定库B不依赖于A,反之亦然吗?在这种情况下,唯一可能被破坏的是#define USE_EXTERNAL_A左右。一个典型的例子是包含zlib的库,除非你为它们提供一个。

答案 2 :(得分:1)

只需制作第三个标题,在其中移动冗余定义(仅一次);然后将此标题包含在原件中。它应该工作。