C/C++源代码的Include依赖关系图

前一篇博文中我曾仔细介绍过如何查看C/C++代码的依赖项关系图,在这篇文章中我将会介绍如何使用Visualization and Modeling Feature Pack 工具包,查看C/C++源代码的Include关系图,这个功能是针对C/C++编程语言本身的特性而新加入的。在这里我依然会使用工程Hilo 作为案例,展示如何以图形化的方式显示工程中源代码文件与头文件之间Include关系。 
首先,在Visual Studio下打开工程Hilo,在菜单栏中选择菜单“体系结构->生成依赖关系图->By Include File”

第一次操作时,有时我们将会发现一个名为“Analyzing Files”的进度框会跳出,提示用户“代码正在解析中”,如图:

稍等片刻后,如下的DGML有向图将会生成,这张图除了展示工程Browser和Common内部源文件与头文件的Include关系外,还显示了工程之间,工程与外部头文件的Include引用关系。 

下面我将会使用自顶向下的方式给您解释如何去阅读和分析这张图。点击该图右键菜单”分组->全部折叠”,我们将会得到下图:

这张图很清晰地告诉我们在当前解决方案中包含2个C++工程,分别是Browser和Common。Browser���包含61个源文件/头文件,而 Common中源文件/头文件的数量是29。工程Browser中的源文件Include了工程Common和”外部”中的头文件,而工程Common仅仅Include了“外部”中的头文件。这里的browser.vcxproj和common.vcxproj比较容易理解,分别包含了这两个工程中所有的源文件和头文件,而在”外部”这个结点中,则包括了所有被工程Browser和common所Include,但不属于这两个项目的头文件.让我们展开”外部”节点, 我们发现其中包含2个名为“Windows SDK”和”C/C++Standard Library”的子节点,如图:

为了区分不同库的头文件,我们根据头文件所属领域的不同,我们将外部引用的头文件分为两类:“Windows SDK”和“C/C++ Standard Library”。节点“Windows SDK”下包含存储路径在“%WindowsSdkDir%\include”下的头文件,而节点“C/C++ Library”下的头文件的存储路径为“%VSINSTALLDIR%\vc\include”。在这里,工程Browser和Common Include的总共引用了“Window SDK”的13个头文件,工程Browser和Common,以及“Windows SDK”库引用了“C/C++ Standard Library”的 12个头文件。 
从上面的图中,我们可以了解到整个解决方案的Include依赖关系图的结构。然而,这个图中有如此多的节点,我们如何来查看我们想要了解的某一个或一些文件的Include依赖关系呢?首先,我们可以通过Ctrl+F来找到我们想要找到的文件。按下Ctrl+F,然后输入 “carouselpane.h”, Visual Studio将自动帮我们定位到所在的节点(如下图),同时与该链接相连的所有链接将会被高亮,链接箭头方向代表Include关系,如图:

源文件“carouselpane.cpp”include了头文件”carouselpane.h”,在图中将会有条始于节点 “carouselpane.cpp”,终于节点“carouselpane.h”的有向链接。停留鼠标在该链接上,显示“导向按钮”,点击“导向按钮” 中的“+”,我们将会被带到源代码文件”CarouselPane.cpp”

在源代码文件”carouselpane.cpp”中,代码行#include “CarouselPane.h”被自动选中,这个操作诠释了源文件“carouselpane.cpp”与“carouselpane.h”的 Include关系。点击右键菜单“查看内容”,头文件“carouselpane.h”将会被打开,

在打开的头文件“carouselPane.h”中,点击右键菜单“Generate Graph of Include Files”,一张关于头文件carouselPane.h Include”和Include By的依赖图将会产生,如下图:

该图所表达的语义是工程Browser下“Carouselpane.h”头文件被3个.cpp文件Include的,并且该文件Include了 8个.h文件。 这样,通过这样的子图,我们就能够比较方便地看到某个文件的Include和Include By依赖关系图了。

总结: 
“Include”依赖图提供了一种以图形化方式显示源文件与头文件间“Include”关系的方式,基于解决方案生成的“Include”图可以帮我们理解工程间以及工程与库头文件的“Include”关系,而基于单个文件的“Include”图可以帮我们进一步理解单个文件的“Include”和 “Include By”依赖关系。

 

 

from:http://blogs.msdn.com/b/almcppcn/archive/2010/08/13/pound-include-dependency-graph-from-cpp-source-codes.aspx

时间: 2024-09-24 11:31:44

C/C++源代码的Include依赖关系图的相关文章

makefile 自动处理头文件的依赖关系 (zz)

现在我们的Makefile写成这样: all: main main: main.o stack.o maze.ogcc $^ -o $@ main.o: main.h stack.h maze.hstack.o: stack.h main.hmaze.o: maze.h main.h clean:-rm main *.o .PHONY: clean按照惯例,用all做缺省目标.现在还有一点比较麻烦,在写main.o.stack.o和maze.o这三个目标的规则时要查看源代码,找出它们依赖于哪些头

查看 sbt 项目的依赖关系树的教程

sbt 是借助于 ivy 来管理项目依赖, 像 Maven 项目中可以用 dependency:tree 来显示依赖树, 那么对于 sbt 项目该如何查看项目依赖关系呢? 本文提及了三种方式来显示项目依赖, 它们是 Shell 脚本, 自定义 sbt 任务, 和 sbt-dependency-plugin 方式. 最后一个办法使得我们也能用 dependencyTree 显示出 Maven 的  dependency:tree 效果来, 还有更酷的的. > dependencyTree [inf

[UML]UML系列——类图class的依赖关系

相关文章          [UML]UML系列--用例图Use Case       [UML]UML系列--用例图中的各种关系(include.extend)       [UML]UML系列--类图Class       [UML]UML系列--类图class的关联关系(聚合.组合) 依赖关系的概念与符号        依赖表示一个类以某种形式依赖于其他类.当两个类处于依赖关系中时,其中一个类的改变可能会影响另一个类.        符号:   依赖关系在代码中的表现       在程序代

UML学习:类图class的依赖关系

依赖关系的概念与符号 依赖表示一个类以某种形式依赖于其他类.当两个类处于依赖关系中时,其中一个类的改变可能会影响另一个类. 符号: 依赖关系在代码中的表现 在程序代码中,依赖关系意味着一个类的对象出现在另一个类的操作中.常见的有两种情况:一个类将另一个类的对象作为自己某个操作的参数(形参),或者是操作的局部变量. 程序演示:code/train class train { public string number; public train(string num) { number = num;

根据源代码生成 类的依赖关系

问题描述 有没有工具或方法分析源代码SRC目录下所有类的依赖关系,生成一个map,包含类之间的依赖,引用关系.比如ClassA{privateBb;privateCc;}ClassB{}ClassC{}那么类A的依赖关系包含B和C两个类 解决方案 解决方案二:哪个啥uml解决方案三:IBMReal-TimeClassAnalysisToolforJavadownloadfromhttp://www.alphaworks.ibm.com/tech/ratcat/download解决方案四:powe

VS2013 生成关系依赖项图的时候出错

问题描述 C#项目,生成关系依赖项图的时候出错,换了项目还是出错,选中项目,右键菜单选择[在代码图上显示],出现一样的错误提示,同学电脑上的VS可以显示,应该是自己的VS哪里设置错了,自己的程序没有使用SQL_SERVER,但是提示数据库连接错误,具体如图:

Thrift的代码生成器Compiler原理及源码详细解析 1 类关系图

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就 用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇 博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为 是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是 生成代码原理都差不多,我主要分析了C++相关代码生成.关于Thrift的使用及原理.代码网上基本上 都

用实体关系图进行数据库建模 (无事可作,转贴)

用实体关系图进行数据库建模 (阿良@仙人掌工作室 2001年08月14日 15:37) 一.概述 很可能你现在正在规划一个数据库驱动的网站:而且几乎可以肯定的是,你一定已经浏览过数据库驱动的网站.过去,一些网站依赖CGI脚本和文本文件存储实现数据持久化,但现在我们能够访问大量不同的关系型.对象-关系型.面向对象型数据库.对于Web应用来说,关系数据库是一种强大的支持工具,这得感谢它们的高可用性.性能,而且相对来说,关系数据库比较容易使用.要找出一个功能完善.源代码开放.能够在多种平台上运行的数据

解析Disruptor的依赖关系

原文地址:http://ifeve.com/dissecting-disruptor-wiring-up/ 作者:Trisha   译者:廖涵  校对:方腾飞 现在我已经讲了 RingBuffer​ 本身,如何从它 读取​ 以及如何向它 写入​.从逻辑上来说,下一件要做的事情就是把所有的东西拼装到在一起. 我前面提到过多生产者的情况--他们通过 ProducerBarrier 保证写入操作顺序与可控.我也提到过简单场景下的多消费者数据访问.更多的消费者的场景会变得更加复杂,我们​ 实现了一些聪明