#line ディレクティブ (C/C++)
#line ディレクティブは、行番号とファイル名に対してコンパイラによって報告される値を、指定された行番号とファイル名に設定するプリプロセッサに指示します。
構文
#line
digit-sequence ["filename"]
解説
コンパイラは、行番号および省略可能なファイル名を使用して、コンパイル時に見つかったエラーを参照します。 通常、行番号は現在の入力行を参照し、ファイル名は現在の入力ファイルを参照します。 行番号は、各行が処理された後、インクリメントします。
digit-sequence の値には、0 から 2147483647 の範囲内 (両端を含む) で任意の整数定数を指定できます。 マクロ置換はプリプロセス トークンで使用できますが、結果は正しい構文に評価される必要があります。 filename は、文字の組み合わせで、二重引用符 (" "
) で囲む必要があります。 filename を省略すると、前のファイル名は変更されません。
#line
ディレクティブを記述して、ソース行番号とファイル名を変更できます。 #line
ディレクティブは、ソース ファイルのディレクティブの直後にある行の値を設定します。 トランスレーターは定義済みマクロ __FILE__
と __LINE__
の値の決定に行番号とファイル名を使用します。 これらのマクロを使用して、説明的なエラー メッセージをプログラム テキストに挿入できます。 これらの定義済みマクロの詳細については、「定義済みマクロ」を参照してください。
__FILE__
マクロは、二重引用符 (" "
) で囲まれた、内容がファイル名である文字列に展開されます。
行番号とファイル名を変更すると、コンパイラでは以前の値が無視され、新しい値で処理が続行されます。 #line ディレクティブは、通常、プログラム ジェネレーターによって使用されます。 これは、生成されたプログラムではなく、元のソース ファイルを参照するエラー メッセージを生成するために使用されます。
例
次の例は、#line
、__LINE__
、__FILE__
の各マクロを示します。
最初の例では、行番号が 10 に設定され、次に 20 に設定され、ファイル名が hello.cpp に変更されます。
// line_directive.cpp
// Compile by using: cl /W4 /EHsc line_directive.cpp
#include <stdio.h>
int main()
{
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 10
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 20 "hello.cpp"
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
}
This code is on line 7, in file line_directive.cpp
This code is on line 10, in file line_directive.cpp
This code is on line 20, in file hello.cpp
This code is on line 21, in file hello.cpp
この例では、特定のアサーションが true でない場合に、マクロ ASSERT
は、定義済みのマクロ __LINE__
と __FILE__
を使用して、ソース ファイルに関するエラー メッセージを出力します。
#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}