【问题标题】:How to read the C-preprocessor file [duplicate]如何读取 C 预处理器文件 [重复]
【发布时间】:2019-06-11 14:29:22
【问题描述】:

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

代码更简单.c

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

为了更简单.h

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 文件的输出时,首先扩展宏,删除 cmets,并丢弃长时间运行的空白行。

我读了这行
# 1 “更简单的.c” 是一个线标记,表示以下行源自文件“simpler.c”的第 1 行。 文件后没有标志,文件中没有描述。

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

int y;


int main()
{

 return 0;
}

这是我最初对 cpp 的描述所期望的。

当天的最后一次编辑。我发现的一件事是命令
cpp -P 更简单的.c 更简单的_cpp 给出输出

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

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

【问题讨论】:

  • # N "file" 标记给定文件中的行号N。后缀数字告诉您有关文件处理状态的信息(大致如下:1 开始,2 完成,3 和 4 与嵌套包含的文件相关)。或者干脆忽略# 行;它们是对预处理器输出的“评论”。

标签: c c-preprocessor


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,这不是家庭作业。我只是从来没有接受过关于幕后发生的事情的深入教育。
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2021-02-25
相关资源
最近更新 更多