C ++函数依赖图

时间:2012-06-04 10:55:44

标签: c++ graph

  

可能重复:
  C++ code dependency / call-graph “viewer”?

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

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

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

5 个答案:

答案 0 :(得分:5)

第一级模块化 - 我希望你已经完成了 - 在中构建你的代码。如果你的代码只是函数的集合 - 即C加上一些语法的含义 - 那么重写你的代码是时候了,因为没有多少依赖图构建会让你免于维护地狱。

如果您拥有类,则模块化应该是找到密切协作的类(例如CustomerOrderInvoice)并将它们分开来自只与它们失去联系的类(如EmployerFacility)。然后从那里拿走它。

模块化代码首先需要思想。没有自动程序可以替代它。实际上,从你写的很少的内容来看,我担心任何自动化过程都会使事情变得更糟,因为显然在这个项目上投入的思想太少了。即,你在不考虑模块化的情况下编写了100万行代码,现在你希望模块化发生,而仍然没有实际考虑它。你正前往史诗般的失败。

答案 1 :(得分:4)

获得一些概述doxygen可能有所帮助。但是你必须使用doxyfile设置来进行一些生成依赖性graps,如果你的代码库很大,你应该从生成的方法中禁用动态内容。 Doxygen可以使用graphviz创建包含,继承,调用和调用者图表。

这里很简单examples但它也适用于较大的{{3}}。 但doxygen只会给你一个概述,没有重构能力。

答案 2 :(得分:1)

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

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

  • Cytoscape(可以使用“了解C / C ++”的输出来显示依赖关系
  • Lattix

答案 3 :(得分:1)

听起来你正在寻找一个重构工具。试着看一下这个问题的答案:Is there a working C++ refactoring tool?

答案 4 :(得分:0)

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