大家好,
我叫Raman Sharma,是VC++IDE团队的项目经理。 我想谈谈visualstudio10中一个名为Call Hierarchy的新特性。 顾名思义,它用于导航所有函数 从呼叫 在一个特定函数和所有函数中 呼叫 一种特殊的功能。 很多人都知道VC6、VS2005和VS2008中有一个名为CallBrowser的特性,它提供了类似的功能。 Call Hierarchy功能是Call Browser的改进版,组织得更好,使用更方便。
在VS2010中,调用层次结构被设计成可以是所有语言的共享特征,即UI是通用的,不同的语言(如C、C、C++等)可以用自己的数据填充UI来解决语言之间的语义差异。 对于C#,这将是一个新特性(请参见 这篇文章 更多细节)。 对于C++,它只是从旧的呼叫浏览器过渡到调用层次结构,以利用新的设计。
让我们看一个例子,说明旧功能和新功能之间的区别。 假设您希望同时查看两个函数的“calls from”和“calls to”信息: CImagingView::OnRButtonUp 和 CImagingView::OnContextMenu
在以前的版本中,这实际上意味着您必须打开以下四个调用浏览器工具窗口:
VS2008中的C++调用浏览器
上述模型明显存在以下限制:
– “Calls From”和“Calls To”在单独的工具窗口中显示(windows 1和3用于呼叫,windows 2和4用于来自的呼叫)
– 每个工具窗口一次只能保存一个函数的调用信息。
– 结果的呈现方式不是很直观:
o 在上面的窗口2中,从 CImagingView::OnContextMenu 列在树的底部,而对这些函数的实际调用列在名为 来自“OnContextMenu”的呼叫 .
o 这两者之间没有联系,使得导航更加困难。
让我补充一下,这些窗口不会像我在上面的截图中那样整齐地叠在一起。
然而,在VS2010中,通过新的调用层次结构功能,相同的信息以以下形式显示在一个工具窗口中:
VS2010中的C++调用层次结构
请注意上述窗口中的以下显著特征:
– 任何函数的“Calls From”和“Calls To”树出现在同一个窗口的同一位置。
– 可以有多个根节点,因此无需为每个函数打开单独的窗口。
o 用户还可以右键单击树中的任何非根节点,并将其添加为新的根节点,以获得更好的清晰度。
– 其结果更易于理解:
o 窗口左窗格中的树只会递归地显示函数的名称(调用者或被调用者)。
o 当您在左窗格中单击结果时,实际的呼叫地点将显示在右窗格中。
o 在右窗格中双击调用站点后,您将被带到编辑器中源代码中的该位置。
– 用户可以将搜索结果限制为当前文件、当前项目或整个解决方案,以获得更好的筛选和性能。
– 用户可以从CallSites窗格复制结果并将其粘贴到其他位置以执行某些分析。
使用旧的呼叫浏览器无法执行上述任何操作。
只需右键单击要查看其结果的函数,即可从编辑器上下文菜单调用“调用层次结构”窗口:
调用层次结构调用
为了构建这个特性,我们使用了新的C++ IDE基础结构,其中的细节被张贴出来。 在这里 最近。 填充函数的“calls from”信息 功能 ,我们只需要解析 功能 找出其中所有被调用的函数。 “调用“执行更广泛的搜索。 对基于SQL的数据库进行查询(解释如下) 在这里 再次)找出 功能 引用,然后对于所有结果,解析它们的封闭代码块,以确定此引用是否实际是对的函数调用 功能 . 我们已尽力确保我们提供给您的结果是准确和完整的。 但是,我们并不声称提供调试器那样的准确性。 例如,你不会看到隐式调用,比如析构函数等,被列在函数调用列表中(也许有一天) J ). 然而,我们已经做了足够的工作来确保在设计、编写和阅读代码时所有相关的信息都是可用的。
总的来说,我们相信新的直观用户界面、更大的灵活性、更少的导航步骤和更好的准确性使新的调用层次结构成为非常有用的特性。 我们对此感到兴奋,希望您会喜欢。
非常感谢。