"Deep"标头依赖关系分析

"Deep" header dependency analysis

本文关键字:关系 Deep 依赖      更新时间:2023-10-16

我在一个中等规模的C/c++项目中工作,我已经应用了氧+Graphviz。它的标题图很有用,但它们只显示基于#include的关系。我有兴趣找到一个(最好是基于linux的)工具,它不仅基于#include,而且基于实际的符号使用来分析文件依赖关系。例如,这样的工具不仅会显示a.cpp包含b.h,而且a.cpp使用b.h包含的c.h中声明的SomeClass。它还可以建议可以修剪的标题内容

我以前用过Include What You Use,效果不错。它使用Clang解析c++代码,并建议要添加的声明和头文件要删除。

一个缺点是它对你的代码布局做了假设——基本上是Google编码标准。所以如果你有一个名为SomeClass.cpp的文件,它只会查看SomeFile.h。此外,建议包括使用项目根目录下的完整路径(因此#include "src/SomeClass.h"而不是#include "SomeClass.h")。最后,我还是把我的代码改成了这种惯例,因为它避免了歧义,但如果你尝试的话,它需要一个提示。

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

编辑:

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