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