6

我是 C 编程语言和 gcc 的新手。

我正在尝试破译一个相当复杂的 C 程序。我想阅读一个有用的列表文件而不是源文件。

我正在寻找由 gcc 编译器创建的列表文件,其中包含:

  1. 所有包含的源代码
  2. 外部参照 = 交叉参考列表
  3. 引用声明变量的位置。例如,如果该行包含i++;,则声明一个注释是 were i

我对此进行了搜索,但是 gcc 有很多选择,我迷路了。

如果有更好的地方可以问我的问题,请告诉我。

4

5 回答 5

4

好吧,我是老派,OP 需要的是预处理器输出,是的,它比 IDE 更有启发性。预处理器处理所有# 语句,如#include 和#ifdef。因此,它向您展示了最终成为编译器输入的内容。g++ 手册页解释了 4 个步骤:预处理、编译、汇编和链接

它继续解释说序列可以在任何时候停止。然后在“预处理器选项”下,解释了控制它的方法。正如另一篇文章所述, -E 可以解决问题,但这只是答案的一部分。要进行更精细的控制,请使用 -f 系列选项,例如 -fdirectives-only。所以可能OP想要的是:

    gcc  -E  -fdirectives-only  -o MySrc.lst  MySrc.cpp

对于那些使用 C++ 的人,我建议直接使用 g++:

    g++  -E  -fdirectives-only  -o MySrc.lst  MySrc.cpp

所需的列表然后在 MySrc.lst

于 2014-04-11T20:00:56.863 回答
2

一种不同的方法。如果你使用 ie Vim 然后在代码上运行 cscope。

例如,我将Ctrl+\作为 cscope 触发器。如果我在一个函数中:

01 #define SOME_BLAH 33
02 
03 void foo() {
04     printf("%d\n", SOME_BLAH); /* <- cursor on SOME_BLAH; 
05                                   trigger + G jumps to line 1 */
06 }
07 
08 void bar() {
09     foo(); /* <- Cursor on foo I hit trigger, G and I jump to line 3 */
10 }

同样,您可以像这样跨文件跳转,进入包含,列出调用特定函数的函数,列出函数正在调用的函数,列出包含文件的文件,跳转到定义变量的位置等。所有这些都在几次击键之内。

每次跳转都会添加到 LIFO 堆栈中,Ctrlt并将一个返回到我输入最后一个跳转到命令的位置。


另外添加 ie Taglist,您会在窗口的一侧获得一个列表,其中所有定义、变量、函数等都在列表中排序。


另一种选择是使用 ie 编译代码-ggdb并在像 Code::Blocks 之类的 IDE 中运行它,使用 DDD 或类似的 - 并在代码作为进程运行时单步执行。可以很有教育意义。


于 2012-04-27T03:23:09.930 回答
2

我理解你的困境。多年前,我试图完全按照你的做法去做,但最终我放弃了。尽管实际上可以做到这一点,但结果会将相关代码淹没在与手头问题无关的代码中,以至于毫无用处。

恐怕您将不得不学习如何以 C 方式阅读 C 代码。如果代码很复杂,并且您是初学者,那么——目前——你可能会不知所措。

如果您仍然想尝试,请查看源的几个 *.h “头”文件的名称。挑选出三四个在您看来可能解决问题的核心部分的头文件。首先阅读这些文件。从那里扩大你的阅读。这并不容易,直到你掌握了它。

祝你好运。

于 2012-04-27T02:34:27.687 回答
1

要回答您的问题 #1,可以通过查看预处理器输出来查看所有包含的源代码gcc -E。但是,该代码可能更难理解,因此它可能不是您真正想要的,尽管我发现它在某些情况下对我需要做的事情很有用。

于 2012-04-27T04:49:45.437 回答
1

你没有。您使用一个单独列出清单的程序。编译器也必须了解打印是愚蠢的。

我推荐a2ps。如需交叉参考,请查找cxref

于 2012-04-27T02:18:54.750 回答