web-dev-qa-db-ja.com

gccプリプロセッサ出力の「#1 "a.c"」のようなハッシュ記号と数字で始まる行の意味は何ですか?

次を使用してCプリプロセッサの出力を出力します

gcc -E a.c

出力には次のような多くの行が含まれます

# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 1 3
# 19 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 3
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 1 3
# 31 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3

# 32 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 20 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 2 3

私はCでこの種の構文を見たことはありません。誰かがこれが何をしているのか説明できますか?

59
user607722

これらの行はデバッグのヒントです(行の次のコードは実際に由来します)

# line-number "source-file" [flags]

フラグの意味(スペース区切り):

  • 1-新しいファイルの開始
  • 2-前のファイルに戻る
  • 3-システムヘッダーファイルからの次のテキスト(#include <> vs #include "")
  • 4-次のテキストは、暗黙のextern "C"ブロックにラップされているものとして扱われる必要があります。
75
jdehaan

これらのlinemarkersman gcc ために -Pオプション。

-Pオプションは、明確にするためにこれらの行を取り除くことを特に意図しています。

gcc -E -P source.c

詳細なドキュメント (前に回答済み)を参照してください。

44
uvsmtid

これらは行同期ディレクティブであり、gcc#includedファイルのエラーに対して正しいエラーメッセージを提供できるようにします。他のプリプロセッサ(yacc/bisonなど)は、同じメカニズムを使用して、Cエラーを入力.yファイルの正しい行に関連付けます。

1
geekosaur