66

ラッパー ヘッダーに関するiOS ドキュメントを引用するには:

#include_next<file> と "file" の包含を区別せず、指定したファイルが現在のファイルと同じ名前であることを確認しません。現在のファイルが見つかったディレクトリの後の検索パス内のディレクトリから始めて、指定されたファイルを検索するだけです。

`#include_next' を使用すると、大きな混乱が生じる可能性があります。他に代替手段がない場合にのみ使用することをお勧めします。特に、特定のプログラムに属するヘッダーでは使用しないでください。これは、fixincludes の行に沿って全体的な修正を行う場合にのみ使用してください。

#include_next とは何か、なぜそれを使用する必要があるのか​​という 2 つの質問があります。

4

3 に答える 3

94

デフォルトのヘッダーを自分で作成したものに置き換えたい場合に使用します。たとえば、「stdlib.h」を置き換えたいとしましょう。プロジェクトに stdlib.h というファイルを作成すると、デフォルトのヘッダーの代わりに含まれます。

#include_next は、stdlib.h を完全に置き換えるのではなく、何かを追加したい場合に使用されます。以下を含む stdlib.h という名前の新しいファイルを作成します。

#include_next "stdlib.h"
int mystdlibfunc();

また、コンパイラは、単純な #include の場合のように、再帰的に stdlib.h を再びインクルードしませんが、「stdlib.h」という名前のファイルの他のディレクトリに続行します

于 2012-04-21T19:30:34.060 に答える
12

何かの複数のバージョンをサポートしている場合に便利です。たとえば、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

于 2016-08-30T15:20:51.560 に答える