プリプロセッサーの行制御ディレクティブ は、 コンパイラー・メッセージに対して行番号を提供します。 このディレクティブにより、コンパイラーは、次のソース行の行番号を指定された番号として表示します。
プリプロセッサーの #line ディレクティブの形式は、次のとおりです。
>>-#--line--+-decimal_constant--+-----------------+-+---------->< | '-"--file_name--"-' | '-characters----------------------------'
コンパイラーがプリプロセスされたソース内の行番号への参照をわかりやすく行えるようにするため、 プリプロセッサーは必要な個所に (例えば、含まれているテキストの始めまたはテキストの終わりの後に)、#line ディレクティブを挿入します。
二重引用符で囲まれたファイル名の指定を行番号の後に続けることができます。 ファイル名を指定すると、コンパイラーは指定されたファイルの一部として 次の行を表示します。ファイル名を指定しないと、コンパイラーは現行ソース・ファイルの一部と して次の行を表示します。
すべての C および C++ インプリメンテーションにおいて、 #line ディレクティブのトークン・シーケンスは、マクロ置き換えをすることがあります。 マクロ置き換え後に結果として得られる文字シーケンスは、10 進定数 (オプションで、 二重引用符で囲まれたファイル名が後に続く) で構成されます。
#line ディレクティブの例
#line 制御ディレクティブを使用して、コンパイラーにもっとわかりやすいエラー・メッセージを提供させることができます。以下のプログラムは 、#line 制御ディレクティブを使用して、認識しやすい行番号を各関数に提供します。
/** ** This example illustrates #line directives. **/ #include <stdio.h> #define LINE200 200 int main(void) { func_1(); func_2(); } #line 100 func_1() { printf("Func_1 - the current line number is %d¥n",_ _LINE_ _); } #line LINE200 func_2() { printf("Func_2 - the current line number is %d¥n",_ _LINE_ _); }
このプログラムの出力は次のようになります。
Func_1 - the current line number is 102 Func_2 - the current line number is 202