如何让IntelliSense在Visual Studio 2008中可靠地工作

有谁知道如何让IntelliSense在C / C ++项目中工作时可靠地工作? 似乎每10个文件中就有一个工作。 Visual Studio 2005似乎比2008年好很多。

编辑:虽然不一定是一个解决scheme,解决方法在这里提供:

如何让IntelliSense在Visual Studio 2008中可靠地工作

如果我想要一个体面的智能感知系统,可能是最好的select。

我也意识到,在某个大项目上,Intellisense有时会“失败”。 为什么? 不知道。

这就是为什么我们购买Visual Assist (来自Tomato软件 ),并通过删除Visual Studio子目录(C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ vcpackages)中的dll feacp.dll来禁用Intellisense。

这不是一个解决scheme,只是一个解决方法。

本机C ++ intellisense在Visual Studio的任何版本中都无法可靠运行。 我发现有两个共同的问题:

1)头文件path没有正确设置。 当您发现智能感应不工作的types时,使用IDE单击每个头文件以find包含该types的文件。 (右键单击#include并select打开文档…)。 如果这在你到达声明types的文件之前失败了,那么这就是你的问题。 确保头文件searchpath正确设置。

和,

2)智能数据库损坏。 这事儿常常发生。 您需要closures解决scheme,删除.ncb文件,然后重新打开该解决scheme。 我发布了我用来解决这个问题的macros。


预处理程序也可能会混淆智能感知 – 所以请确保构build过程中的任何#define也可用于智能感知。 除此之外,我不知道还有什么可以打破它。 我还没有看到任何与前瞻性声明有关的特殊问题。

对于我们这些无法获得视觉助手的人来说,看起来有希望:

重build智能感知

你有没有安装(或卸载)的加载项? 我发现这影响了我的智能感知。

除此之外,只要确保您的工具 – >选项 – >文本编辑器 – >所有语言“自动列表成员”和“参数信息”被closures。

我不使用VS2008的C + +,只有VB和C#,但我发现,当intellisense停止工作(真正的VS2003 / 2005/2008),这是因为在项目/文件中的东西坏了 – 通常是一个错误的参考或代码。

VB和C#有更好的intellisense支持,因为能够反映在引用的程序集来构build智能感知树。

C ++必须遍历函数原型的包含文件,如果path不正确,则不会find所有的原型头文件。

我的修复itellisense之后,那个可怕的重构实用工具剁碎我的代码是必需的。 问题是一个类头文件包含了一个#include本身。 recursion引用破坏itellisense。 如果itellisense可以看到其他类而不是当前的类,这就是一个症状。 也:

使用#pragma一次以消除重复的头负载

如果项目现在需要花费更长的时间来加载,那么试图理解导致缺乏完成支持的冲突。

通常它只有一个受到影响的类对象,它显示了什么文件(通常是头文件)。

@ 约翰·理查森 / @ 乔纳森·荷兰

我的包括设置正确,没有问题。 我也尝试了NCB重build几次,但它从来没有将其修复100%。

我有一种感觉,可能是与类的前向声明有关。 例如为了减less头文件中包含的复杂性,我们通常会做类似如下的事情:

class MyPredeclared; class SomeOtherClass { private: MyPredeclared* m_pPointer; } 

我不知道是否把它拧了? 任何其他的想法? 项目越大,肯定会越糟糕。

我有一个非常恼人的问题,intellisense只在一些文件中工作,没有任何明显的原因…我花了几个小时的谷歌挖掘,但我终于明白,其原因确实是recursion参考! 我正在使用:

 #ifndef CLASS_H #define CLASS_H ... #endif 

避免重新定义符号,这有时会破坏大型项目的智能化。

但是,对ifndef-define-endif进行评论并且放一个:

 #pragma once 

在头文件的开头,仍然避免重新定义,并有智能感知再次工作=)=)

至less,这对我工作,希望它是有用的…

干杯弗朗切斯科

我最近研究了VS2008中的Intellisense,因为我正在开发一个相当大的C ++数值线性代数库,其中广泛使用了模板等。 Intellisense很快就停止了这个项目,我放弃了,但是现在没有它,现在变得非常烦人,于是我开始调查了。 这是我发现的:

假设有一个文件,包含“打断”智能感知的代码,

  • 如果打破Intellisense的头文件在项目中,但不是#include d,它仍然在文件的其余部分
  • 如果包含它们,但没有使用内部声明的types,它仍然有效
  • 如果它们被包含并且使用了一个在里面声明的types,它可能仍然有效(对于成员没有Intellisense,在给定types发生后没有Intellisense,但是至less在全局名称和参数信息之前)
  • 如果智能感知被破坏在一个.cpp文件中,它仍然可以在其他问题代码不被包括或使用的地方工作(但是我想如果它崩溃坏了,它将被整个项目禁用,尽pipe这不会发生我)
  • 智能感知似乎在成功编译后更新(有时不在之前)
  • 把破碎的代码放入#if 0/* .. *///似乎可以使Intellisense放心

从我使用的C ++特性中,实际上只有less数几次中断Intellisense:

  • 在模板参数中比较'>'或'> ='(例如static_assert<(size > 0)>
    • 没有通过使用双括号解决( static_assert<((size > 0))>没有帮助)
    • 通过使用'<'或'<='来解决( static_assert<0 < size>工作)
    • 通过将值存储在枚举中并使用它来专门化模板来解决
  • 显式函数模板专门化禁用参数信息(例如function<type>(args)
    • 可能无法解决(也许包裹在一个macros),但我可以忍受它被打破
  • 例如Matrix::MakeMatrixType<3, 3>::Result r;
    • 很难弄清楚为什么会发生这种情况(可能是因为使用了Eigen)
    • 通过在单独的.cpp中移动这样的代码来解决这个问题,其中IS将不起作用(并不总是可行的)

似乎这些问题中的一部分是由于一些“简化”的parsing,而不是一个合适的C ++parsing器。 有了上面的信息,使Intellisense在现有代码中工作的“可靠”方法是:

  1. 设置一个空的项目(一个控制台应用程序),使用虚拟void main() {}创buildMain.cpp。
  2. 包括您的一个破损的头文件,和math.h
  3. build立(必须编译,以便Intellisense可靠地更新)
  4. testingIntellisense是否正在通过键入例如sin(并查看是否有参数帮助popup。有时候,这将工作,但成员的帮助不会 – 所以尝试以及。
  5. 在头文件中build立一个东西的实例,build立,看看是否设法杀死IS。
  6. 从罪魁祸首文件中删除代码,并转到第3步
  7. find并解决有问题的代码后,将代码在步骤5中删除,再试一次
  8. 在完成整个课程后,创build下一个课程的实例,等等…

我发现通过这种方式可以很容易地找出造成问题的代码位置(我意识到这对于大型项目来说可能是不可行的,在我的情况下,只有97个问题中的一个文件存在问题)。 请注意,这里的“构build”是指编译,链接阶段不需要完成,所以没有解决的外部是好的,IS应该更新。

另一种更新IS(除了build筑物)的方法是保存所有东西,closures工作区,删除.ncb文件并重新打开它。 然后等待“更新智能感知…(N)”从状态栏中消失(如果不完全一致,则N指向零),这种情况表明进展出现问题。 我觉得这很枯燥。

关于这个问题,我已经注意到了一些有趣的东西(在Visual Studio 2010上):为了解决这个问题,我改变了#include sintax在我的头文件之前(用VS 2005完成旧项目并使用VS 2010重新打开):

 #include <myfile.h> 

我解决这个问题:

 #include "myfile.h" 

智能感知开始正常工作后! 我希望这可以帮助!

我不得不重置设置…

C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE> devenv.exe / ResetSettings

在这里线程

问题是与.vcproj文件。

你会发现,如果你从debugging模式切换到释放模式,build立,然后尝试智能感知它经常工作。

closuresVisual Studio。 如果在项目中search.vcproj文件,请编辑它们并searchAdditionalIncludeDirectories的前两个实例。 这个值应该看起来像“.. \,…. \”而不是“../ ..”。

重新打开你的项目,让Intellisense完成build设,那么它应该被修复。