“深度”标头依赖性分析

时间:2011-05-04 18:48:05

标签: c++ c header dependencies

我参与了一个中型C / C ++项目,我已经应用了Doxygen + Graphviz。它的标题图很有用,但它们只显示基于#include的关系。我有兴趣找到一个(最好是基于linux的)工具,它不仅基于#include而且基于实际的符号使用来分析文件依赖性。例如,此类工具不仅会显示a.cpp包含b.h,而且a.cpp会使用SomeClassc.h所声明的b.h }。它还能够建议可以修剪的标题包括。

1 个答案:

答案 0 :(得分:20)

我之前使用Include What You Use取得了不错的成绩。它使用Clang来解析C ++代码并建议转发声明以添加和删除头文件。

一个缺点是它假设您的代码布局 - 基本上是Google编码标准。因此,如果您有一个名为SomeFile.h的文件,它只会查看SomeClass.cpp。此外,建议的还包括使用项目根目录中的完整路径(因此#include "src/SomeClass.h"代替#include "SomeClass.h")。最后,我将代码更改为此约定,因为它避免了歧义,但如果您尝试它,它需要抬头。

通常你可以设置CC=include-what-you-use并重建以获得结果 - 它使用所有clang机制来解析-I包含参数。有一个python程序使用结果自动更新#include行。

修改

另一个不那么复杂的工具,但设置起来比较简单,可以建议移除#include deheader。它的工作原理是将C ++文件复制到临时位置,删除#include并重新编译。如果重新编译工作,那么删除该头文件是安全的。它不会做的是建议前向声明或任何花哨的东西,但它可以减少实现文件中不必要的包含行。