#include_next ディレクティブ (IBM 拡張)
プリプロセッサー・ディレクティブ #include_next は #include ディレクティブのように動作しますが、インクルードするファイルのディレクトリーを、指定されたファイルを検索するためのリストから、特に除外するところが異なります。インクルードするファイルのディレクトリー以下にあるすべての検索パスは、インクルードされるファイルを検索するためのパスのリストから除外されます。 これにより、ファイルの複数バージョンを、同じ名前でアプリケーションの異なる部分に組み込むことができます。または、1 つのヘッダー・ファイルを別のヘッダー・ファイルに、同じ名前 (それ自身を再起的に組み込むヘッダーは付いていない) で組み込むことができます。 異なるファイル・バージョンが異なるディレクトリーに保管される場合に、このディレクティブで、ファイル名を指定するために絶対パスを使用する必要なしに、ファイルの各バージョンにアクセスすることができるようになります。
このディレクティブはヘッダー・ファイルのみで使用する必要があり、file_name によって指定されたファイルがヘッダー・ファイルでなければなりません。ファイル名を囲むために使用する、二重引用符と不等号括弧との間に違いはありません。file_name には、データ・セットを指定することができます。そのファイルがデータ・セットであることを指示するには、file_name の前にダブルスラッシュ (//) を使用します。#include_next ディレクティブの構文 >>-#--include_next--+-"--+-----------+--file_name--"-+--------->< | +-file_path-+ | | '-//--------' | '-<--+-----------+--file_name-->-' +-file_path-+ '-//--------'
検索パスが #include_next ディレクティブでどのように解決されるかという例として、ファイル t.h の 2 つのバージョンがあると想定します。最初のファイルは、ソース・ファイル t.c に組み込まれ、サブディレクトリー path1 にあります。2 番目のファイルは最初のファイルに組み込まれ、サブディレクトリー path2 にあります。
t.c のコンパイル時に、両方のディレクトリーがインクルード・ファイル検索パスとして指定されます。
/* t.c */
#include "t.h"
int main()
{
printf(", ret_val);
}
/* t.h in path1 */
#include_next "t.h"
int ret_val = RET;
/* t.h in path2 */
#define RET 55;
#include_next ディレクティブは、プリプロセッサーに、 path1 ディレクトリーをスキップし、path2 ディレクトリーからインクルード・ファイルの検索を開始するよう指示します。このディレクティブにより、t.h の異なる 2 つのバージョンを使用でき、この結果 t.h が繰り返しインクルードされることがなくなります。
