在Visual Studio中显示C ++文件的#include层次结构


169

问题:我有一个大型的Visual C ++项目,我正尝试将其迁移到Visual Studio2010。它是来自各种来源和各个年龄段的大量内容的组合。我遇到了问题,因为同时包含winsock.hwinsock2.h

问题:有哪些工具和技术可以显示#includeVisual Studio C ++源文件的层次结构?

我知道如何cl /P获取预处理器输出,但是并不能清楚地显示出哪个文件包括哪些其他文件(在这种情况下,/P输出为376,932行长8)。

在理想的情况下,我想要分层显示哪些文件包括哪些其他文件以及行号,这样我就可以跳到源代码中:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h

2
对于需要GCC / Clang解决方案的人们,请使用gcc -H -fsyntax-only ...输出层次结构。感谢stackoverflow.com/a/18593344/427545
Lekensteyn,

Answers:


234

有一个设置:

项目设置->配置属性-> C / C ++->高级->显示包含

这将生成树。它映射到编译器开关/ showIncludes


20
注意:可以在“输出”窗口中看到层次结构。
CannibalSmith,2009年

3
如果任何人的兴趣:即使你选择铛平台工具集,你仍然可以“演出内容包括”如果你加-HC/C++ -> Command Line - Additional Options
WIP

3
仍然不如gcc的“包含自”功能好,该功能显示与编译时错误相关的直接包含层次结构,并且还显示行号。
保罗

2
我做了一个快速的正则表达式,删除了Visual Studio包含的内容(“程序文件”(x86)下的所有内容)。您可以将输出窗口复制+粘贴到Notepad ++之类的应用中,并进行正则表达式查找并替换为空白,以从树中剥离所有VS包含的内容:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf

2
请注意,虽然可以为单个源文件切换/ showIncludes,但是除非在项目级别设置/ showIncludes,否则它将无效。
David Carr

20

编译器还支持/ showIncludes开关-它不给您行号,但是可以提供一个全面的视图,其中包括来自何处。

它位于项目设置->配置属性-> C / C ++->高级->显示包含。


+1非常感谢!(但是恐怕xtofl会更快地被接受)。
RichieHindle

17

我们发现IncludeManager是一个非常强大的工具。它不是免费的(但并不昂贵),它可以通过修剪掉我们不使用的大部分包含内容来解决我们的包含问题,并将编译时间从50分钟减少到8分钟。


5
ow!我在有问题的文件上运行了IncludeManager,它生成的图表使我大笑。根据我的计算,我需要一个400英寸的显示器来查看整个情况。我认为我们无法提供帮助
。8

2
更新-IncludeManager母公司ProFactor(www.profactor.co.uk)停业了,但可以从上述网站免费提供其最新版本。不利的一面是,它仅适用于从VS2005到VS2013的完整版本的Visual Studio。
丹娜

5

不如gcc的分层包含功能,该功能在出现错误时显示了直线包含层次。VS中的“显示包含”选项可显示所有内容,这在调试层次结构包含文件问题时显得过高。


我已经等了5年了,这是我与mingw一起使用的。
fantastory 2014年

2
也许添加一些如何使用它的细节,文档在哪里等等?这个答案目前并没有增加多少。
山姆·布莱曼

4

是一个很好的第三方FOSS工具。您可以将结果导出到XML,其中将包含有关出现次数和行号的数据。


4

现在有一个名为IncludeToolbox的 Visual Studio插件。它可以列出您的从属包含,并执行更多操作,例如随机删除并编译以查看是否需要该包含。



2

cl / P应该显示行号,以便您可以知道包含头文件的位置的上下文。

如果您使用...

grep“ ^#line” file.i

...那么您应该清楚地知道预处理器按顺序遇到了哪些文件。

如果是一次性事件,这应该是一个非常快速的诊断。


2
当然可以,但是这给了我八千行非结构化输出,没有层次结构。
RichieHindle

我一直在浏览cl / P输出足够长的时间,想知道是否有更好的工具来完成这项工作。现在我发现了,这很棒。问题一般性的,答案将永远存在于此,以便其他人找到。
RichieHindle

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.