我最近想开始为开源C++项目做贡献。我只有很少的C++经验,所以选择Visual Studio作为IDE,并随SP1更新。我得到了相对容易构建的解决方案,并且想要对代码进行一些导航以获得概述。

这是我注意到有时“转到定义”/“转到声明”不起作用的时候。当我右键单击源代码中的符号时,这两个选项都可用,但是当我在头文件中时,“转到定义”仅将我带到有关那些函数的声明。当我使用.cc文件时,总是会进入同一文件中的定义。

我注意到有关此功能的其他一些事情是:

1)对于某些功能,我可以从头文件导航到定义,但是另一个方向坏了

2)如果声明更改为与定义完全匹配,则可以固定某些功能的导航,例如

header declaration:
    void buche(sint64 betrag, player_cost type);
source definition:
    void karte_t::buche(sint64 const betrag, player_cost const type)

改成
header declaration:
    void buche(sint64 const betrag, player_cost const type);

->导航双向

3)单击源文件中相关功能的代码块时,顶部的范围菜单变为“(全局范围)”,而不是在右侧显示小箭头(这是前向声明I的符号)呢?)和类名(但是那些函数肯定是类成员)

我进行了很多搜索,这似乎是一个相对知名的问题。该网站上有一个主题:How to get IntelliSense to reliably work in Visual Studio 2008

我还在Microsoft论坛上找到了多个线程(由于只允许发布两个超链接,所以无法链接),但是没有正式确认错误或其他内容。

我发现的答复的精髓是,应该删除.ncb文件(据我所知,它已被VS2010中的.sdf数据库取代),或使用该选项在加载解决方案时重建数据库。我多次做了所有这些,但无济于事。在Stackoverflow上,该线程获得的最高评分答复似乎暗示这只是一个错误(Intellisense的错误-我是否正确地说,正是这个自动完成组件也负责代码导航?),一个人必须接受,这表明使用Visual Assist代替,但是问题是关于VS2008的,一个答复指出VS2010在此方面进行了改进。另一个答复归咎于递归引用,但我-认为-这在该项目中不是问题,因为所有文件(肯定是我检查过并遇到问题的那几个文件)都包含保护措施。该项目的一位编码人员也向我证实了他也有同样的问题。但是我不太想花钱在Visual Assist上,这只是出于一点爱好...

拥有丰富的Eclipse/Java经验,对我来说似乎很奇怪,IDE的这种相对重要的功能无法可靠地工作。当然,我可以理解,C++的静态代码分析比Java困难得多。但是话又说回来,Visual Studio是具有很多开发周期的商业产品。

因此,总而言之,这是不可避免的错误吗?

最佳答案

我想这取决于您认为不可避免的事情。

以我的经验,Intellisense问题似乎主要是由模板,宏或两者引起的。

Intellisense使用的解析器/预处理器似乎无法以与编译器相同的方式工作,并且在某些情况下,它可能会丢失信息并做出错误的假设。

如果您正在编码并且突然发现Intellisense已损坏,则您刚刚添加了一个相当复杂的模板类(一个使用其他模板类,或者您使用另一个模板类实例化的模板类,或者其他任何奇怪的东西),或者是一个宏(同样,尤其是复杂的问题),通常可以假设是造成问题的原因。
通常,通过重新排列代码,进行一些简化或只是随机更改代码,您将能够恢复Intellisense(通常也仅在删除.sdf文件之后)。

这相当不方便,但是如果它是破坏它的库,那就更糟了。尤其是某些Boost库,倾向于经常中断它。在这些情况下,很难避免。

无论如何,Intellisense一直在稳步提高。 VS2010比VS2008更加准确和稳定,而VS2012似乎也比VS2010更好(尽管我还没有使用过)。

实际上,如果您对VS2010没有任何特定的依赖性,则可能只想更新到VS2012。

关于visual-studio-2010 - "Go to Definition"/"Go to Declaration"在VS2010中无法正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10237744/

10-13 08:43