“深度”头部依赖分析

Posted

技术标签:

【中文标题】“深度”头部依赖分析【英文标题】:"Deep" header dependency analysis 【发布时间】:2011-08-18 19:20:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我之前使用过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 行。

编辑:

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

【讨论】:

看起来很有希望,尽管它没有要安装的二进制文件确实很痛苦。当我开始编译 llvm 时,它把我的硬盘填满了。 @Reinderien llvm+clang 的检出和构建“仅”在 1Gb 左右,记得将 --enable-optimized 传递给配置脚本。调试版本将使您回到 4Gb 左右。 我终于能够构建 IWYU - 是的,它体积庞大、臃肿等等,但总比没有好。我也来看看deheader。谢谢

以上是关于“深度”头部依赖分析的主要内容,如果未能解决你的问题,请参考以下文章

Spring 深度分析

基于深度多任务学习的自然语言处理技术

Java并发编程(十四):Semaphore源码逐行深度分析

采埃孚深度应用图像识别技术

深度分析狩猎者夹子机器人项目系统开发(逻辑框架)详情

基于x86-64 Linux-5.0.1的Socket与系统调用深度分析