何かの複数のバージョンをサポートしている場合に便利です。たとえば、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
、ヘッダー検索パスにプレフィックスを付けます。
多重評価を防ぐには注意が必要ですが、gcc を使用している#include_next
場合は明らかに gcc に依存してもかまいません。その場合、ステートメント式も使用できます。
このアプローチは、新しいバージョンが「主要な」ターゲットである場合に便利ですが、古いバージョンの下位互換性が限られた期間だけ望まれます。したがって、古いバージョンを徐々に廃止し、現在のバージョンを参照してコードをクリーンに保とうとしています。
代替案
または、賢明な人になり、C++を使用し、オーバーロードされた関数とテンプレートインライン関数を使用してください:p