C 预处理器输出

4

对于以下输入的C程序,使用gcc -E sample.c -o sample.i

 #include <stdio.h>
 int main() {
   printf("hello world\n");
   return 0;
 }

sample.i文件输出以下内容,前面有若干个#符号,我想知道这一行具体表示什么意思。

# 1 "sample.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "sample.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
...

在谷歌上搜索“gcc预处理器输出格式”,第一个结果。 - Eugene Sh.

后跟数字会导致指令无效。这些特别指出了不同宏定义的位置。

- rtpax
1

行号 文件名 标志

- Sourav Ghosh
@MartinR 也许这个问题比人们说重复的那个更好? - Edwin Buck
1个回答

4

有注释可以帮助人们了解预处理器如何扩展各种#include <...> 宏和其他项目。

阅读这些行就相当于阅读预处理器在遇到宏并扩展它们时记录的日志消息。

# 1 "sample.c"

从输入文件“sample.c”的第一行开始

# 1 "<built-in>"

处理内置的c预处理器指令(必须是实现细节),但被呈现为一个虚假的“文件”。

# 1 "<command-line>"

处理命令行指令(具体实现方法再次强调),以伪造“文件”的形式呈现。

# 1 "/usr/include/stdc-predef.h" 1 3 4

在第一行添加 stdc-predef.h 文件,它是文件的起始位置,禁止针对系统头文件的警告,确保符号被视为 C 语言符号。

# 1 "<command-line>" 2

从命令行返回“fake”文件。

# 1 "sample.c"

回到sample.c文件。

# 1 "/usr/include/stdio.h" 1 3 4

现在从文件 "stdio.h" 开始,抑制允许的系统警告,将文件中的符号视为 C 符号。

# 27 "/usr/include/stdio.h" 3 4

等等……

这里有相关的文档。


太棒了!感谢你的帮助。 - RSStepheni
@RSStepheni 很高兴能帮忙。不用谢。 - Edwin Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接