在 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.hwinsock2.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 作为关键字?

如何在 c++ 语言的 Visual Studio 代码编辑器中突出显示错误?

使用 C++ 项目 (Visual Studio) 中的参数调用 Python 函数