如何读取 C 预处理器文件



我呼吁人群帮助我了解如何读取预处理器输出。我正在尝试在 Ubuntu 18.04 上完成一个简单的 C 应用程序的编译过程。

代码更简单。

#include "simpler.h"
int main()
{
// This is a comment
return 0;
}

为了更简单。

int y;

然后我运行命令

username$ cpp simpler.c simpler_cpp

然后生成预处理的 c 文件,如下所示

# 1 "simpler.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "simpler.c"
# 1 "simpler.h" 1
int y;
# 3 "simpler.c" 2
int main()
{
return 0;
}

看了一下,我不确定我是否遵循如何读取此文件?或者至少用我理解的术语来说。但是,我确实看到我的评论不再存在,并且我的头文件中有我的行。但除此之外,这还不太清楚。

我试图用这个文件告诉自己一个"故事",例如"#1 是文件的预处理器索引,所以总共有 #1、#31、#32 和 #3 或 4 个文件"。"#31"意味着什么...我真的不知道是什么?

如果有人能帮我解释这个文件,我将不胜感激。

我一直在尝试关注页面 http://gcc.gnu.org/onlinedocs/cpp/index.html#Top 但它读起来更像是一本百科全书,虽然如果你知道路线图很好,但如果你从头开始,它会变得更具挑战性。

可能的答案: 感谢您的回复, 根据 https://gcc.gnu.org/onlinedocs/gcc-9.1.0/cpp/Preprocessor-Output.html#Preprocessor-Output

读取预处理的 C 文件的输出时,将展开第一个宏,删除注释,并丢弃长串的空白行。

我读了
#1"simpler.c"行 是一个行标记,表示以下行源自第 1 行的文件"simpler.c"。 文件之后没有标志,文件中没有描述。

我能做的另一件事是查看
行#1"simpler.c">
并说文件simpler.c存在,然后忽略它。这可能是最实际的做法。 除了我想知道#1">
内置">
#1"命令行">
是什么意思? 如果我忽略这些,那么我会得到看起来像

int y;

int main()
{
return 0;
}

这是我最初从 cpp 的描述中期望的。

当天的最后编辑。我发现的一件事是命令
cpp -P simpler.c simpler_cpp 给出输出

int y;
int main()
{
return 0;
}

手册页中有一个 no #line 标志,用于输出没有任何行信息的预处理文件。我猜这确实是唯一重要的输出。我猜这个输出应该有一个 .i 扩展名,但我不知道.哦,好吧,我希望这对其他人有用。如果我发现任何好的信息,我会尝试写一些东西。

#开头的行存在,因此编译器可以在正确的文件和行上报告错误。最好的办法是 忽略他们 .它们之间是 C 代码,其中扩展了所有宏和包含文件。通常读取预处理器输出以调试宏,但您的示例没有。

我想这是一个家庭作业来演示包含文件。

最新更新