我是C编程语言和gcc的新手。
我正在尝试破译一个相当复杂的C程序。我想阅读一个有用的列表文件而不是源文件。
我正在寻找由gcc编译器创建的列表文件,其中包含:
i++;
,则会声明一条说明i
的说明。我搜索了这个,但是gcc有很多选择,我迷路了。
如果有更好的地方提出我的问题,请告诉我。
答案 0 :(得分:2)
答案 1 :(得分:2)
我理解你的困境。多年前,我试着做你正在做的事,但最终我放弃了。虽然一个字面意思可以做到这一点,但结果会将相关代码淹没在与手头问题无关的大量代码中,以至于无用。
我担心您将不得不学习如何以C语言阅读C代码。如果代码很复杂,并且你是初学者,那么 - 目前 - 你可能已经过头了。
如果你想尝试它,那么看一下源的几个* .h“header”文件的名称。选择三个或四个头文件,您可能会解决问题的核心部分。首先阅读这些文件。从那里扩大阅读范围。这是不容易的,直到你摆脱它。
祝你好运。答案 2 :(得分: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堆栈中, Ctrl t 会将其返回到我输入最后一个跳转命令的位置。
另外添加ie Taglist
并在窗口一侧获得一个列表,其中所有定义,变量,函数等都按列表排序。
另一种选择是使用ie -ggdb
编译代码并在类似Code :: Blocks的IDE中运行它,使用DDD等 - 并在代码作为进程运行时逐步执行。可以很有教育意义。
答案 3 :(得分:1)
要回答问题#1,可以通过使用gcc -E
查看预处理器输出来查看所有包含的源代码。但是,该代码可能更难以理解,因此它可能并不是您真正想要的,尽管我发现它在某些情况下对我需要做的事情很有用。
答案 4 :(得分:1)
嗯,我老了,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中找到所需的列表