"Deep"标头依赖关系分析
"Deep" header dependency analysis
我在一个中等规模的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行。
- C++GTKMM gui循环依赖关系
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 如何记住这种递归关系?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 移动语义和深层/浅层复制之间有什么关系?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 对在不同二进制文件中创建的对象文件的依赖关系
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- 关于记忆后这种递归关系的时间复杂度
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 超市管理系统的类别之间应该是什么关系?
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- "Deep"标头依赖关系分析