如果您支持某些东西的多个版本,这很方便。例如,我正在编写支持 PostgreSQL 9.4 和 9.6 的代码。存在许多内部 API 更改,主要是现有函数的新参数。
兼容性标头和包装函数
我可以用包装器函数编写兼容性标头,static inline
并为所有内容使用新名称,基本上是包装器 API,我在代码中的任何地方都使用包装器名称。说something_compat.h
:
#include "something.h"
static inline something*
get_something_compat(int thingid, bool missing_ok)
{
assert(!missing_ok);
return get_something(thingid);
}
但是_compat
到处散布或任何后缀都很难看。
包装头
相反,我可以在针对旧版本构建时在包含路径中插入一个兼容性标头,例如compat94/something.h
:
#include_next "something.h"
#define get_something(thingid, missing_ok) \
( \
assert(!missing_ok), \
get_something(thingid) \
)
所以其余的代码可以只使用 9.6 签名。在针对 9.4 构建时,我们将前缀-Icompat94
到标题搜索路径。
需要注意防止多次评估,但如果你正在使用#include_next
你显然不介意依赖 gcc。在这种情况下,您还可以使用语句表达式。
当新版本是“主要”目标时,这种方法很方便,但在有限的时间段内需要旧版本的向后兼容性。因此,您将逐步弃用旧版本,并尝试参考当前版本保持代码清洁。
备择方案
或者做个懂事的人,用C++,用重载函数和模板内联函数:p