5

我最近想开始为一个开源 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认为?)和类名(但这些函数绝对是类成员)

我搜索了很多,这似乎是一个相对知名的问题。网站上有一个线程:如何让 IntelliSense 在 Visual Studio 2008 中可靠地工作

我还在微软论坛上找到了几个线程(我无法链接,因为我只能发布两个超链接),但没有官方确认错误或其他内容。

我发现的答复的精髓是应该删除 .ncb 文件(据我了解,该文件已被 VS2010 中的 .sdf 数据库取代),或者使用选项在加载解决方案时重建数据库。我都做了很多次,没有用。Stackoverflow 上该线程上评分最高的回复似乎暗示这只是一个错误(Intellisense 的 - 我是否理解正确,它是这个自动完成组件也负责代码导航?)必须接受,建议使用视觉辅助取而代之的是,当时的问题是关于 VS2008 的,一个回复指出 VS2010 在这方面有所改进。另一个回复归咎于递归引用,但我认为这在这个项目中不是问题,因为所有文件(当然是我检查过并遇到问题的少数文件)都包含保护。该项目的一位编码员也向我证实,他也有同样的问题。但我并不是那么热衷于在 Visual Assist 上花钱,它只是为了一个小爱好......

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

所以总结这篇文章,这是一个不可避免的错误吗?

4

1 回答 1

2

我猜这取决于你认为不可避免的事情。

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

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

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

这相当不方便,但如果是图书馆破坏了它,那就更糟了。尤其是一些 Boost 库,往往会经常破坏它。在这些情况下,很难避免。

无论如何,Intellisense 正在稳步改进。VS2010 比 VS2008 准确和稳定得多,而且 VS2012 似乎也比 VS2010 好(虽然我还没有使用太多)。

事实上,如果您对 VS2010 没有任何特殊依赖,您可能只想更新到 VS2012。

于 2013-07-18T12:38:55.187 回答