【问题标题】:Displaying the #include hierarchy for a C++ file in Visual Studio在 Visual Studio 中显示 C++ 文件的 #include 层次结构
【发布时间】: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

【问题讨论】:

标签: c++ visual-studio include


【解决方案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】:

      【讨论】:

        【解决方案8】:

        我将DoxygenGraphViz 用于类层次结构图形,并在文本中使用依赖关系树。

        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 输出很长时间了,想知道是否有更好的工具来完成这项工作。现在我发现有,这很棒。这个问题笼统的,答案将永远在这里,供其他人找到。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2017-07-15
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多