我参与了一个中型C / C ++项目,我已经应用了Doxygen + Graphviz。它的标题图很有用,但它们只显示基于#include
的关系。我有兴趣找到一个(最好是基于linux的)工具,它不仅基于#include
而且基于实际的符号使用来分析文件依赖性。例如,此类工具不仅会显示a.cpp
包含b.h
,而且a.cpp
会使用SomeClass
中c.h
所声明的b.h
}。它还能够建议可以修剪的标题包括。
答案 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
并重新编译。如果重新编译工作,那么删除该头文件是安全的。它不会做的是建议前向声明或任何花哨的东西,但它可以减少实现文件中不必要的包含行。