在没有导入的情况下接受以下存根程序:
int main(void) {
return 0;
}在它上运行cpp会给我以下信息:
$ cpp main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
int main(void) {
return 0;
}我理解它在# 1 "main.c"中添加的意思是#line 1 "main.c"或“这里是给定的main.c程序的第1行。我非常想了解其他的cpp行是做什么的。例如,这个片段:
# 1 "main.c" <-- why necessary if we have this after the last line and re-defined?
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2发布于 2021-03-03 22:57:40
CPP命令及其输出
当您使用cpp命令时,C预处理器将产生一个文本输出,与在编译器中使用它时不同,当它只向编译器本身传递一些二进制标记时。
因此,您正在读取的文本输出非常类似于“调试”或“日志记录”(如果您愿意的话)会话(或“讲故事”(如果您愿意))。它基本上会让你了解它是如何扩展发现的宏的。
因此,正如您已经发现的,预处理器正在以以下格式的一行输出行号信息和源文件名:
# linenum filename {flags}
名为linemarker,字面意思是:
这一行是在名为
filename的linenum行中找到的。
如果指定了任何标志,它们的范围可以从1到4,并表示如下:
extern "C"块中。让我们逐一分析这几行:
# 1 "main.c"下面一行是在line 1 of main.c,没有其他标志。所以,就像说“我开始读main.c的第1行了”
# 1 "<built-in>"现在,我将阅读内置的C预加工指令。注意这些是如何显示为<System Header>的,但是如果是虚构的话。因此,这一行设置了一个标准的预定义宏,如_LINUX_或__cplusplus。
阅读更多关于那些这里的信息
额外提示:运行cpp -dM main.c查看所有预定义的宏。
# 1 "<command-line>"现在,我将读取一个命令行选项,即由-D标志设置的命令行选项之一,比如-DTEST=0,甚至命令行-DTEST=0,甚至是-UTEST。这些文件再次从预处理器中显示为虚构的系统头文件。
阅读更多关于预处理选项这里的内容
# 31 "<command-line>"在第31行,我正在读取来自命令行的另一个宏。(注意,它们是按找到的顺序设置的)
# 1 "/usr/include/stdc-predef.h" 1 3 4我将读取位于/usr/include/stdc-predef.h的预定义宏文件,以确保该头文件将像系统文件头一样包含,并且它包含的符号被视为C符号。
# 32 "<command-line>" 2我将继续阅读命令行“伪标题”,并将完成阅读。
# 1 "main.c"我现在继续读main.c
https://stackoverflow.com/questions/66465272
复制相似问题