处理与第三方库的向后兼容性的一种方法是围绕它创建一个包装库/源文件,并确保您的应用程序永远不会从任何其他地方调用第三方库的任何函数。
假设您依赖于提供两个头文件“foo.h”和“bar.h”的第三方库。在库的版本 1 中,文件可能如下所示:
foo.h:
void foo1();
int foo2();
bar.h:
void bar1(int);
int bar2(int);
假设他们在第 2 版中扩展了界面,现在它们看起来像:
foo.h:
void foo1();
int foo2();
double foo3();
bar.h:
void bar1(int);
int bar2(int);
int bar3(double);
在您的应用程序中,您希望能够在与库的版本 2 链接时使用 foo3() 和 bar3(),但您希望能够优雅地处理库版本 1 中缺少这些功能.
您可以使用以下方法来完成此操作。
为库创建一个包装器 .h 文件。
foo_bar_wrapper.h:
namespace foo_bar_wrapper
{
void foo1();
int foo2();
double foo3();
void bar1(int);
int bar2(int);
int bar3(double);
}
然后,将它们实现为传递到第三方库。
foo_bar_wrapper.h:
#include "foo.h"
#include "bar.h"
namespace foo_bar_wrapper
{
void foo1() { ::foo1(); }
int foo2() { return ::foo2(); }
double foo3() { return ::foo3(); }
void bar1(int x) { return ::bar1(x); }
int bar2(int x) { return ::bar2(x); }
int bar3(double x) { return ::bar3(x); }
}
但是,由于库的版本 1 不支持 foo3 和 bar3,您可以使用:
namespace foo_bar_wrapper
{
void foo1() { ::foo1(); }
int foo2() { return ::foo2(); }
double foo3()
{
#if FOO_LIBRARY_VERSION > 1
return ::foo3();
#else
// Deal gracefully with version 1
#endif
}
void bar1(int x) { return ::bar1(x); }
int bar2(int x) { return ::bar2(x); }
int bar3(double x)
{
#if FOO_LIBRARY_VERSION > 1
return ::bar3(x);
#else
// Deal gracefully with version 1
#endif
}
}
确保在构建应用程序时正确定义 FOO_LIBRARY_VERSION。