我是 C 编程语言和 gcc 的新手。
我正在尝试破译一个相当复杂的 C 程序。我想阅读一个有用的列表文件而不是源文件。
我正在寻找由 gcc 编译器创建的列表文件,其中包含:
- 所有包含的源代码
- 外部参照 = 交叉参考列表
- 引用声明变量的位置。例如,如果该行包含
i++;
,则声明一个注释是 werei
。
我对此进行了搜索,但是 gcc 有很多选择,我迷路了。
如果有更好的地方可以问我的问题,请告诉我。
好吧,我是老派,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
一种不同的方法。如果你使用 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 或类似的 - 并在代码作为进程运行时单步执行。可以很有教育意义。
我理解你的困境。多年前,我试图完全按照你的做法去做,但最终我放弃了。尽管实际上可以做到这一点,但结果会将相关代码淹没在与手头问题无关的代码中,以至于毫无用处。
恐怕您将不得不学习如何以 C 方式阅读 C 代码。如果代码很复杂,并且您是初学者,那么——目前——你可能会不知所措。
如果您仍然想尝试,请查看源的几个 *.h “头”文件的名称。挑选出三四个在您看来可能解决问题的核心部分的头文件。首先阅读这些文件。从那里扩大你的阅读。这并不容易,直到你掌握了它。
祝你好运。
要回答您的问题 #1,可以通过查看预处理器输出来查看所有包含的源代码gcc -E
。但是,该代码可能更难理解,因此它可能不是您真正想要的,尽管我发现它在某些情况下对我需要做的事情很有用。