C++函数依赖关系图
C++ function dependency graph
可能的重复项:
C++代码依赖/调用图"查看器"?
我正在开发一个巨大的C++代码库,目前我遇到了模块化代码的问题。我必须将我的代码划分为单独的独立模块。
我能想到的一种方法是生成依赖关系图,然后进行更高级别的分类。另一种方法是从一个入口点(某些函数abc()
)开始,并生成一个函数调用树,其每个节点将包含该函数所在的文件的名称。此后,我可以使用一些脚本将这些功能提取到单独的模块中。
我的问题是,有什么工具可以帮助我完成这项任务吗?以前有没有人遇到过这样的问题。或者你能建议任何方法来实现同样的目标吗?
模块化的第一级 - 我希望你已经这样做了 - 是在类中构建你的代码。如果你的代码只是函数的集合——即 C 加上一些语法 suggar——那么是时候重写你的代码了,因为再多的依赖图构建也无法将你从维护地狱中拯救出来。
如果你有类,模块化应该是找到紧密协同工作的类(如Customer
、Order
和Invoice
),并将它们与仅与它们松散耦合的类(如Employer
或Facility
)分开。然后从那里拿走它。
模块化代码首先需要思考。没有自动程序可以替代它。实际上,从你写的一点点来看,我担心任何自动化过程都会让事情变得更糟,因为显然对这个项目的思考已经太少了。也就是说,你写了100万行代码而不考虑模块化,现在你希望模块化发生,但仍然没有真正考虑它。你正走向史诗般的失败。
要获得一些概述,doxygen可能会有所帮助。但是你必须稍微改变一下doxyfile设置来生成依赖抓取,如果你的代码库很大,你应该从生成的方法中禁用动态内容。Doxygen可以使用Graphviz创建包含图、继承图、调用图和调用方图。
这里有一些简单的例子,但它也适用于更大的例子。但是doxygen只会给你一个概述,没有重构功能。
我经常使用"了解C/C++"来研究这些依赖关系。
如果代码库非常庞大,并且您从头开始模块化,您可能需要查看其他一些工具,例如:
- Cytoscape(可以采用"了解 C/C++"的输出来可视化依赖关系
- 拉蒂克斯
听起来你正在寻找一个重构工具。试着看看这个问题的答案:是否有一个有效的C++重构工具?
一种方法会有点长,但您可以做的是删除一个方法并编译以查找依赖项,然后将颓废分组到一个组件中。虽然这不能完全解决您的问题,但这是一种开始的方法。
- C++GTKMM gui循环依赖关系
- 从不同的附加依赖项中识别等同命名的函数
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 如何在头文件中声明类模板(由于循环依赖关系)
- C++ 类/结构中的函数依赖属性
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 现代编译器是否可以在使用依赖关系注入时取消虚拟化函数调用
- 具有模板函数的循环依赖关系
- 通过包装器对象的构造函数将依赖关系传递给包装器对象
- 复制具有相互引用/循环依赖关系的类的构造函数
- C++函数依赖关系图
- 是否有任何工具可以显示函数中的数据依赖关系
- C++:成员类之间的构造函数依赖关系
- 在c++中,当组合对象构造函数有依赖关系时,如何在初始化列表中强制它们的顺序
- 构造函数依赖注入:unique_ptr + move vs shared_ptr
- 接受std::函数的模板函数,该函数依赖于模板形参
- 循环数据依赖关系析构函数
- 当函数依赖于两个不同的类时,避免进行类型检查
- 模板类成员函数之间的循环依赖关系
- 如何将'this'作为参数传递给另一个没有循环依赖关系的类构造函数?