我最近想开始为一个开源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)当点击源文件中相关功能的代码块时,顶部的范围菜单变为“(全局范围)”而不是向右显示小箭头(这是一个符号我认为前向声明?)和类名(但这些函数绝对是类成员)
我搜索了很多,这似乎是一个相对众所周知的问题。网站上有一个主题:How to get IntelliSense to reliably work in Visual Studio 2008
我还在微软论坛上发现了几个主题(我无法链接,因为我只允许发布两个超链接),但没有官方确认错误或其他东西。
我发现回复的精髓是应该删除.ncb文件(已经被VS2010中的.sdf数据库取代,据我所知),或者在加载解决方案时使用该选项重建数据库。我多次做了所有这些,无济于事。 Stackoverflow上线程上评价最高的回复似乎暗示这只是一个错误(Intellisense的错误 - 我是否正确,这是自动完成组件,它还负责代码导航?)一个人必须接受,建议使用Visual Assist代替,但问题是关于VS2008然后一个回复指向VS2010在此改进。另一个回复归咎于递归引用,但我认为 - 这不是这个项目中的问题,因为所有文件(当然是那些我已经检查并遇到问题的文件)都包含了警卫。该项目的一位编码员也向我证实他有同样的问题。但我不是那么热衷于在Visual Assist上花钱,这只是一个小小的爱好......
在Eclipse / Java方面有很多经验,对我来说这样一个相对重要的功能无法可靠地工作似乎很奇怪。当然,我可以理解静态代码分析对于C ++而言比对Java要困难得多。但话说回来,Visual Studio是一个商业产品,它有很多开发周期。
所以总结这篇文章,这是一个不可避免的错误吗?
答案 0 :(得分:2)
我猜这取决于你认为不可避免的事情。
根据我的经验,Intellisense问题似乎主要是由模板,宏或两者引起的。
Intellisense使用的解析器/预处理器似乎与编译器的工作方式不同,在某些情况下,它可能缺少信息并做出错误的假设。
如果您正在编码并突然发现智能感知被破坏,您刚刚添加了一个相当复杂的模板类(一个使用其他模板类,或者您使用另一个模板类或任何奇怪的实例),或者一个宏(再次,特别是复杂的宏),你通常可以认为这是造成它的原因。 通常,通过重新排列代码,简化它或者随意更改它,您将能够恢复智能感知(通常只有在删除.sdf文件之后)。
这是相当不方便的,但如果它是一个破坏它的库,那就更糟了。特别是一些Boost库倾向于经常打破它。在这些情况下,要避免更难。
无论如何,智能感知在某种程度上正在稳步提升。 VS2010比VS2008更加准确和稳定,VS2012似乎也比VS2010更好(虽然我还没有使用它)。
事实上,如果你对VS2010没有任何特别的依赖,你可能只想更新到VS2012。