以哈希符号开头的行和gcc预处理器输出中的'#1“a.c”'之类的数字是什么意思?

时间:2011-03-20 18:34:36

标签: gcc c-preprocessor

我使用

打印出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中看到过这种语法。有人可以解释这是做什么的吗?

3 个答案:

答案 0 :(得分:72)

这些行是用于调试的提示(实际来自该行之后的代码)

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

标志的含义(空格分隔):

  • 1 - 开始新文件
  • 2 - 返回上一个文件
  • 3 - 以下文字来自系统头文件(#include&lt;&gt; vs #include“”)
  • 4 - 以下文本应被视为包含在隐式extern“C”块中。

答案 1 :(得分:43)

man gcc -P选项中提到了行标记

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

gcc -E -P source.c

detailed documentation(之前的回答)。

答案 2 :(得分:1)

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