如何阅读极其复杂的 C++程序

2022-08-03 07:46:59 +08:00
 kerrspace

JAVA GO RUST 同理 最近在读一个芯片设计领域从逻辑综合工具产生的 json 文件恢复 RTL 信息的 C++代码 虽然是一个相对独立的功能模块 但是涉及到大几百到上千个类 各种函数、类的指针飞来飞去 trace 定义 trace 到几十个文件 还有的代码感觉跟这个模块的 input output 毫无关系不知道在干嘛的(但是一修改结果马上就不对了)

求问下各位资深的开发人员 大佬们拿到一个不是很熟悉的复杂代码 你们是如何尽快熟悉功能结构再到二次开发的呢?在读复杂程序方面有没有什么心得体会传授一下

我现在很容易就陷入到 想一想这个事情就觉得千头万绪无处下手的感觉 东看一下西看一下感觉没有个主轴或者说总的思路 效率很低

3455 次点击
所在节点    程序员
17 条回复
aptupdate
2022-08-03 08:12:17 +08:00
我现在做的这个 Java 项目和你说的情况差不多,更恶性的是参数动辄十几个,而且还都没注释,要么注释是错的。光靠看根本不行,还是得 debug……
kerrspace
2022-08-03 08:25:17 +08:00
@aptupdate 对 我就是想知道 在这种信息极度不对称的情况下 有没有什么快速学习代码功能的方法论。。。
zhuangzhuang1988
2022-08-03 08:26:56 +08:00
VisualStudio + F5 就好了
要是不支持的话 只能祈求多福吧.
xsen
2022-08-03 08:28:29 +08:00
从业务流程入手,先主流程,然后次级别流程
不要关注过于细节的问题,容易只见树木不见森林

C++的代码维护过无文档,注释牛头不对马嘴——代码量十来万的几个项目,都是这样的做法;相对来说是最快、最有效的
sadfQED2
2022-08-03 08:50:57 +08:00
断点调试,一行一行的跟呗
Vaspike
2022-08-03 08:51:22 +08:00
只能 debug
encro
2022-08-03 09:02:47 +08:00
先求需求开始:搞清楚需求,然后思考如果是我来设计,有哪些设计方案,然后看代码的方案和流程是否和你思考的匹配,不匹配点在哪里?原来这样设计的原因可能是什么?----当然原来的设计不一定是最佳。尝试对原有代码进行分类整理。画出主要和分支逻辑流程图。

然后从你不会的点开始: 那里看不懂,原因是什么,解决办法是什么?光想没用的,动手改造才是正确途径,比如对原有代码进行无痛分类整理,大函数化小函数,补上注释,编写测试代码。


所以,最快上手流程是:

用 debug 工具跑完一个流程,看调用了哪些函数,给这些函数加上注释,然后数理流程(画出流程图 /思维导图 /整理文字),然后思考和验证流程,然后再看旁支末结。
nmap
2022-08-03 09:29:29 +08:00
你是要完全搞懂?还是为了修 bug ?两种方式完全不一样😑
yehoshua
2022-08-03 09:57:41 +08:00
为了学习还是为了调试?调试断点一步步走就可以。学习的话用代码查看软件会方便一些。
msaionyc
2022-08-03 10:13:59 +08:00
最好还是让他跑起来,之前看其他一些框架源码也是,不跑起来,干看太累太累了,而且效率低,有时候调用关系啥的还理不明白
lingalonely
2022-08-03 11:24:44 +08:00
只要代码能跑,debug ,debug ,debug 。代码不能跑,那就只能你跑咯
xdeng
2022-08-03 11:39:18 +08:00
Source Insight VSCode
SM7
2022-08-03 12:15:06 +08:00
1. 跑起来
2. 打断点看 调用堆栈
3. 打 log
4. 改造验证
haoxue
2022-08-03 21:28:03 +08:00
@xsen 赞同,再针对关键代码采用 debug 的方式作为辅助
zhanlanhuizhang
2022-08-04 09:39:34 +08:00
用 understand 这样的软件看看。可以帮助理解。
unlighted
2022-08-04 09:54:30 +08:00
个人的话,会从主代码入手,先看主线,看完之后看局部代码是什么策略.需要配合 IDE,通过 find reference 方便查看那些通过函数指针进行回调的函数
FranzKafka95
2022-08-04 12:40:34 +08:00
阅读工具上使用 source insight,阅读时通过思维导图或者流程图帮忙梳理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/870342

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX