C++函数依赖关系图

C++ function dependency graph

本文关键字:关系 函数依赖 C++      更新时间:2023-10-16

可能的重复项:
C++代码依赖/调用图"查看器"?

我正在开发一个巨大的C++代码库,目前我遇到了模块化代码的问题。我必须将我的代码划分为单独的独立模块。

我能想到的一种方法是生成依赖关系图,然后进行更高级别的分类。另一种方法是从一个入口点(某些函数abc())开始,并生成一个函数调用树,其每个节点将包含该函数所在的文件的名称。此后,我可以使用一些脚本将这些功能提取到单独的模块中。

我的问题是,有什么工具可以帮助我完成这项任务吗?以前有没有人遇到过这样的问题。或者你能建议任何方法来实现同样的目标吗?

模块化的第一级 - 我希望你已经这样做了 - 是在中构建你的代码。如果你的代码只是函数的集合——即 C 加上一些语法 suggar——那么是时候重写你的代码了,因为再多的依赖图构建也无法将你从维护地狱中拯救出来。

如果你类,模块化应该是找到紧密协同工作的类(如CustomerOrderInvoice),并将它们与仅与它们松散耦合的类(如EmployerFacility)分开。然后从那里拿走它。

模块化代码首先需要思考。没有自动程序可以替代它。实际上,从你写的一点点来看,我担心任何自动化过程都会让事情变得更糟,因为显然对这个项目的思考已经太少了。也就是说,你写了100万行代码而不考虑模块化,现在你希望模块化发生,但仍然没有真正考虑它。你正走向史诗般的失败。

要获得一些概述,doxygen可能会有所帮助。但是你必须稍微改变一下doxyfile设置来生成依赖抓取,如果你的代码库很大,你应该从生成的方法中禁用动态内容。Doxygen可以使用Graphviz创建包含图、继承图、调用图和调用方图。

这里有一些简单的例子,但它也适用于更大的例子。但是doxygen只会给你一个概述,没有重构功能。

我经常使用"了解C/C++"来研究这些依赖关系。

如果代码库非常庞大,并且您从头开始模块化,您可能需要查看其他一些工具,例如:

  • Cytoscape(可以采用"了解 C/C++"的输出来可视化依赖关系
  • 拉蒂克斯

听起来你正在寻找一个重构工具。试着看看这个问题的答案:是否有一个有效的C++重构工具?

一种方法会有点长,但您可以做的是删除一个方法并编译以查找依赖项,然后将颓废分组到一个组件中。虽然这不能完全解决您的问题,但这是一种开始的方法。