你好,我叫Raman Sharma,是VC++团队的程序经理。 通过这个博客文章,我想强调一下我们对C++ IDE中的一个重要特性的一些改变,称为“查找所有引用”。 大多数人都知道,这个特性用于在整个解决方案中搜索对代码的任何元素(类、类成员、函数等)的引用。 在VisualStudio2010中,我们对此功能进行了一些更改,以提供更大的灵活性。
让我们通过一个例子来看看这些变化。 假设您有以下代码:
图1:示例代码
旧世界
在VisualStudio2008中,如果调用成员函数上的“查找所有引用” 打印区 班级 圆圈 例如:
图2:调用Find all引用
您将看到显示行号7、20和26的结果,如下所示:
图3:与2008年相比的结果
需要注意的是,结果窗口 没有 列出“printArea”一词出现的所有位置。 它只具体列出printArea表示“成员函数”的位置 打印区 班级 圆圈 “(调用了Find all References)。 关键是,这在某种意义上是一个编译器验证的搜索(我刚刚创造了这个术语,但这个概念是正确的) J 其中,你将得到你所搜索的C++符号。
新世界
在VisualStudio2010中,我们有效地创建了两种搜索模式:一种侧重于速度,另一种侧重于准确性。 不用说,您可以通过选项指定默认模式,我们将记住该设置。 更多关于这一点在本帖后面。
速度模式
如果执行与VS 2010中上述相同的操作,默认情况下将得到以下结果:
图4:VS2010的默认结果
请注意,这一次,结果窗口 做 列出单词“printArea”出现的所有位置(包括注释!)。 为什么?因为我们想为用户提供一个不调用编译器的搜索选项。 不用说,这个选项将大大加快搜索速度,特别是对于点击率很高的大型项目。
值得一提的是,这个搜索是 不像 只是在整个解决方案中搜索一些文本。 这是因为对于这个搜索,C++ IDE使用索引来缩小要搜索的文件的列表。 所以它不会查看解决方案中的所有文件。 结果是比“在文件中查找”(或grep)的性能要好得多,特别是对于大型解决方案。
精度模式
但是,我们理解,在某些情况下,您可能希望通过进一步过滤结果来减少歧义。 这意味着你需要更好的准确性。 如果搜索某个类的成员函数,则只需要引用该类的成员函数。 即使在同一个类中有其他类具有相同的命名成员或该函数的其他重载,也是如此。 为此,右键单击结果窗口中的结果并调用“Resolve results”:
图5:调用解析结果
“解析结果”使用编译器实际验证/确认条目,并删除不完全匹配的引用。 您将看到以下结果,其中仅包含对 圆形::打印区域 :
图6:VS 2010的解决结果
如果你觉得更具冒险精神,那么精确度模式还有另一部分,就像向编译器提出以下问题: 筛选出尽可能多的无关结果,对于那些您不确定的结果,仍然显示它们 . 你想问这个问题的原因是你是否想在搜索结果中包含注释,不同宏状态的代码等等。
问这个问题的方法是在窗口中右键单击已解决的结果,然后取消选中“隐藏未确认的结果”:
图7:取消选中“隐藏未确认”
这样做将确保搜索结果仅排除编译器已验证的结果 绝对不是 参考文献 圆::打印区域。 编译器验证的所有内容都是正确的,不确定的内容都将列出。 结果如下:
图8:VS 2010中已解决和未确认的结果
请注意,这次的结果包括注释。 值得一提的是,这是VS2008唯一支持的模式
搜索的默认模式是速度模式。 这意味着,当您调用Find all References时,您将看到搜索项出现的所有位置。 但是,与visualstudio中的其他所有内容一样,有一种方法可以更改此默认行为。 如果你去“工具->选项>文本编辑器-> C/C++ +高级”,在引用下你会发现两个新选项“禁用解析”和“隐藏未确认”:
图9:设置默认搜索模式的选项
默认情况下,“禁用解析”标志设置为True(表示速度模式)。 将其设置为False将导致编译器验证所有结果(意味着精确模式)。 类似地,“Hide unconfirm”标志的默认值为True。 将其设置为False将确保搜索结果除了包含已解析的结果外,还包含未确认的结果。 只有当第一个标志设置为False时,第二个标志才有意义。 还要注意的是,从结果窗口解析/取消解析不会影响这些标志的值。 这些是用于指定默认行为的全局设置。
总的来说,我们相信这些变化带来了更多的灵活性,使用户能够根据自己的需求优化他们的体验。 我们对这一变化感到兴奋,希望您会喜欢。
非常感谢。