在 Visual Studio 中显示 C++ 文件的 #include 层次结构
Posted
技术标签:
【中文标题】在 Visual Studio 中显示 C++ 文件的 #include 层次结构【英文标题】:Displaying the #include hierarchy for a C++ file in Visual Studio 【发布时间】:2010-11-11 09:33:54 【问题描述】:问题:我有一个大型 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
【问题讨论】:
对于寻找 GCC/Clang 解决方案的人,使用gcc -H -fsyntax-only ...
输出层次结构。感谢***.com/a/18593344/427545
【参考方案1】:
有一个设置:
项目设置 -> 配置属性 -> C/C++ -> 高级 -> 显示包含
这将生成树。它映射到编译器开关/showIncludes
【讨论】:
注意:层次结构可以在输出窗口中看到。 如果有人感兴趣:即使您选择 Clang platform toolset,如果您在C/C++ -> Command Line - Additional Options
中添加 -H
,您仍然可以“显示包含”
仍然不如 gcc 的“包含自”功能,后者显示与编译时错误相关的直接包含层次结构,并且还显示行号。
我制作了一个快速的正则表达式,去除了 Visual Studio 包含的内容(Program Files (x86) 下的任何内容)。您可以将输出窗口复制并粘贴到 Notepad++ 之类的应用程序中,然后执行正则表达式查找并用空白替换以从树中删除所有 VS 包含:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
请注意,虽然可以为单个源文件切换 /showIncludes,但除非在项目级别设置 /showIncludes,否则它将不起作用。【参考方案2】:
编译器还支持 /showIncludes 开关——它不会为您提供行号,但可以提供一个非常全面的视图来了解哪些包含来自何处。
它位于项目设置 -> 配置属性 -> C/C++ -> 高级 -> 显示包含。
【讨论】:
+1 非常感谢! (但我担心 xtofl 会因为更快而被接受)。【参考方案3】:我们发现IncludeManager 是一个非常强大的工具。它不是免费的(但并不昂贵),它使我们能够掌握我们的 Include 问题,并通过删减大量未使用的 include 将编译时间从 50 分钟缩短到 8 分钟。
【讨论】:
喂!我在有问题的文件上运行了 IncludeManager,它生成了一个让我大笑的图表。根据我的计算,我需要一台 400 英寸的显示器才能看到整个情况。我认为我们已经超出了它的能力范围。8-) 更新 - IncludeManager 的母公司 ProFactor (www.profactor.co.uk) 已经停业,但从上述网站免费提供其最新版本。缺点是它仅适用于从 VS2005 到 VS2013 的完整版 Visual Studio。 IncludeManager 链接自 9 月 21 日起已更改:profactor.co.uk/home IncludeManager 需要 Visual Studio.NET 2005 到 2013,所以几乎不再可用。【参考方案4】:不如 gcc 的分层包含功能,它在出错的情况下显示直接包含层次结构。 VS 中的“显示包含”选项显示所有内容,这在调试分层包含文件问题时显得过大。
【讨论】:
我已经等了 5 年了,我和 mingw 一起使用过。 也许添加一些关于如何使用它的细节,文档在哪里等等?这个答案目前并没有增加太多。 不需要文档。当发生编译时错误时,gcc 只显示包含层次结构。【参考方案5】:现在有一个名为 IncludeToolbox 的 Visual Studio 插件。它可以列出您的依赖包含并执行更多操作,例如随机删除和编译以查看是否需要该包含。
【讨论】:
【参考方案6】:Here 是一款不错的第三方开源工具。您可以将结果导出为 XML,其中将包含有关出现次数和行号的数据。
【讨论】:
【参考方案7】:尝试redhat Source-Navigator 以获得更多graphical solution。
【讨论】:
【参考方案8】:我将Doxygen 和GraphViz 用于类层次结构图形,并在文本中使用依赖关系树。
Doxygen: Class Hierarchy
Doxygen diagrams: include hierarchy (classes)
同时安装。确保选择 GraphViz 作为生成层次图的工具。选择“使用 GraphVix 包中的点工具”。
还要确保将 GraphViz 中的二进制目录包含到您的 PATH 环境变量中。
【讨论】:
我试过这个,但我无法找到一种方法来显示包含头层次结构。我可以看到类 X 派生自类 Y 以及 graphviz 中的类似内容,但不是包含列表。是否有一些我错过的隐藏旋钮? 我明白了。 GraphViz 只会以图形方式显示您提到的内容(类层次结构)。这是 Doxygen 的一个示例:doxygen.nl/manual/examples/diagrams/html/hierarchy.html 如果您不使用类并且需要不同的列表,也许您可以尝试另一个答案。我会更新答案。谢谢。 是的,它对类层次结构问题非常有用——我喜欢它生成的图表。但是,我正在寻找标题包含图,我认为这是 OP 在这里列出的。我会尝试其他一些问题。感谢您强迫我完成这项工作(尽管它在我的整个代码库中崩溃,因为它非常大,但它在子集上效果很好)【参考方案9】:cl /P 应该向您显示行号,以便您可以了解包含头文件的上下文。
如果你用 ... 找出这些行
grep "^#line" file.i
...那么您应该对预处理器按顺序遇到的文件有一个非常清晰的指示。
如果是一次性事件,这应该是一个非常快速的诊断。
【讨论】:
当然,但这给了我八千行非结构化输出,没有层次结构。 我已经浏览了 cl /P 输出很长时间了,想知道是否有更好的工具来完成这项工作。现在我发现有,这很棒。这个问题是笼统的,答案将永远在这里,供其他人找到。以上是关于在 Visual Studio 中显示 C++ 文件的 #include 层次结构的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio C++ 项目中使用 cusp
如何在 Visual Studio 2008 和 C++ 中显示希腊字符? [复制]
在 Visual Studio 中显示 C++ 文件的 #include 层次结构
为啥 Visual Studio 2008 在 C++ 代码中突出显示 internal 作为关键字?