gcc预处理器输出中以“#1”ac“'开头的行号是什么意思?

我用C打印出C预处理器的输出

gcc -E ac 

输出包含许多行

 # 1 "ac" # 1 "<built-in>" # 1 "<command-line>" # 1 "ac" # 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中看到这种语法。有人可以解释这是什么吗?

这些行提示debugging(实际上来自该行后面的代码)

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

标志含义(空格分隔):

  • 1 – 开始一个新的文件
  • 2 – 返回到前一个文件
  • 3 – 以下文本来自系统头文件(#include <> vs #include“”)
  • 4 – 下面的文本应该被视为包裹在一个隐含的外部“C”块。

这些linemarkersman gcc中提到了-P选项。

-P选项专门用于清除这些行:

 gcc -E -P source.c 

见详细的文件 (以前回答)。

这些是行同步指令,它允许gcc#include d文件中的错误提供正确的错误消息。 其他预处理器(如yacc / bison )使用相同的机制将C错误与input.y文件中的正确行相关联。