"深度"标头依赖性分析

Rei*_*ien 23 c c++ dependencies header

我在一个中型C/C++项目上工作,我已经应用了Doxygen + Graphviz.它的标题图很有用,但它们只显示基于的关系#include.我有兴趣找到一个(最好是基于linux的)工具,它不仅可以#include根据实际的符号使用情况来分析文件依赖性.例如,这种工具不仅表明a.cpp包括b.h,但a.cpp使用SomeClass的是被声明中c.h包含的b.h.它还能够建议可以修剪的头部包含.

ric*_*chq 21

我之前使用过包含你使用过的效果非常好.它使用Clang来解析C++代码并建议转发声明以添加和删除头文件.

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

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

编辑:

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