web-dev-qa-db-ja.com

C言語での#lineの意味は何ですか?

の意味は何ですか #line[〜#〜] c [〜#〜]言語で?どこで使用されますか?

23
Yongwei Xing

これは、次の行が実際にどこから来たのかをコンパイラーに通知します。通常、これらを追加するのはCプリプロセッサのみです。たとえば、ファイルを含めると、別のファイルを参照していることをコンパイラに通知します(基本的には1つのデータストリームのみを表示します)。

これは奇妙に聞こえるかもしれませんが、プリプロセッサはインクルードを指定した場所にヘッダーファイルを挿入するだけで、コンパイラはすべて(ソースコードと一緒に連結されたすべてのヘッダーファイル)で動作します。使用している場合は、プリプロセッサステージの結果を確認できます。 gccとgcc -E myfile.c。そこでは、ファイルを含めるたびに、またコンパイラに送られるテキストの量を減らすたびに、#lineディレクティブが追加されることに気付くでしょう(大量のコメントが単一の#lineディレクティブに減り、先にスキップする場合など)

また、bison/yaccなどの他のプログラムでも使用され、問題(コンパイルの問題がある場合)が特定の行のルールファイルに関連していることを通知します。これがなければ、コンパイラは実行できません。 bison/yaccはcファイルを生成します。

33
falstro

これは、プリプロセッサライン制御ディレクティブと呼ばれます。

両方の膨張__FILE__および__LINE__は、#lineディレクティブが使用されます。これにより、コンパイラは次のソース行の行番号を指定された番号として表示します。

その主な用途は、コンパイラにもっと意味のあるエラーメッセージを提供させることです。

詳細な説明と使用例は IBMのドキュメント にあります。

15
codaddict

プラグマ キーワードです:

"#lineを使用すると、コンパイラの行番号と(オプションで)エラーと警告のファイル名出力を変更できます。この例は、関連する2つの警告を報告する方法を示しています。 #line 200ディレクティブは、行番号を強制的に200にし(デフォルトは#7ですが)、次の#lineディレクティブまで、ファイル名は「Special」として報告されます。#linedefaultディレクティブは行を返します。以前のディレクティブによって番号が付け直された行をカウントするデフォルトの番号付けに番号付けします。」

1
Amirshk

これにより、ファイルの見かけの行番号を変更できます。

私が考えることができる唯一の用途は、長い一連の複数行マクロの後で行番号を正気にすることです。

使用法は次のとおりです。

#line 42
0
Colin Valliant

これは主に、Cファイル(ヘッダーまたは実装)が作成されたソースファイルのファイル名と行番号を提供するために使用されます。その場合、コンパイラは、生成されたファイルではなく、ソースファイルを示唆する診断を発行します。

プリプロセッサはこれを使用して、これらが展開された前処理済みファイルに含まれているヘッダーを示唆します。

0
sbi