问题: 我有一个大型 Visual C++ 项目,正在尝试将其迁移到 Visual Studio 2010。它是来自不同来源和不同时期的内容的巨大组合。我遇到问题,因为某些内容同时包含
winsock.h
和 winsock2.h
。
问题: 有哪些工具和技术可用于显示 Visual Studio C++ 源文件的
#include
层次结构?
我知道
cl /P
用于获取预处理器输出,但这并没有清楚地显示哪个文件包含哪些其他文件(在这种情况下,/P
输出为 376,932 行长 8-)
在完美的世界中,我希望能够分层显示哪些文件包含哪些其他文件以及行号,以便我可以跳转到源代码:
source.cpp(1)
windows.h(100)
winsock.h
some_other_thing.h(1234)
winsock2.h
有一个设置:
项目设置 -> 配置属性 -> C/C++ -> 高级 -> 显示包含
这将生成树。它映射到编译器开关 /showInincludes
编辑(2024 年 1 月 9 日)
2022 17.9 将包含一个更有用的工具:“#include Diagnostics”;参见博客文章。
编译器还支持 /showIncludes 开关——它不会给你行号,但可以提供一个相当全面的视图,了解哪些包含来自哪里。
它位于“项目设置”->“配置属性”->“C/C++”->“高级”->“显示包含”下。
我们发现IncludeManager是一个非常强大的工具。它不是免费的(但也不贵)已经开发完毕并且现在免费。它仅支持 Visual Studio 2005 至 2013。
它使我们能够控制我们的 Include 问题,并通过删除我们没有使用的大块包含来将编译时间从 50 分钟减少到 8 分钟。
不如 gcc 的分层包含功能,该功能在出现错误时显示直接包含层次结构。 VS 中的“showincludes”选项显示了所有内容,这在调试分层包含文件问题时有点过分了。
现在有一个 Visual Studio 插件,名为 IncludeToolbox。它可以列出您的依赖包含并执行更多操作,例如随机删除和编译以查看是否需要该包含。
尝试使用 redhat Source-Navigator 以获得更多 图形化解决方案。
IncludeFinder 是一个很好的第 3 方、FOSS 工具。您可以将结果导出到 XML,其中包括有关出现次数和行号的数据。
cl /P 应该显示行号,这样您就可以知道头文件包含在哪里的上下文。
如果你用...来找出这些行
grep "^#line" 文件.i
...那么您应该可以清楚地了解预处理器按顺序遇到的文件。
如果这是一次性事件,这应该是一个非常快速的诊断。