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

时间:2008-09-02 13:13:37

标签: c++ c visual-studio-2008 intellisense

有没有人知道如何在C / C ++项目中使IntelliSense可靠地工作?它似乎适用于大约1/10的文件。 Visual Studio 2005似乎比2008年好很多。

编辑:虽然不一定是解决方案,但这里提供了解决方法:

How to get IntelliSense to reliably work in Visual Studio 2008

如果我想要一个像样的智能感知系统,可能是最好的选择。

12 个答案:

答案 0 :(得分:31)

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

1)未正确设置头文件路径。当您找到intellisense不起作用的类型时,使用IDE单击每个头文件以查找包含该类型的头文件。 (右键单击#include并选择Open Document ...)。如果在到达声明类型的文件之前失败,那么这就是你的问题。确保头文件搜索路径设置正确。

2)intellisense数据库已损坏。这事儿常常发生。您需要关闭解决方案,删除.ncb文件,然后重新打开解决方案。我在回答另一个问题here时发布了我用于此的宏。


预处理器也可以混淆智能感知 - 因此请确保构建期间的任何#defines也可用于智能感知。除此之外,我不知道还有什么可以打破它。我没有看到前向声明的任何特殊问题。

答案 1 :(得分:27)

我也意识到,在一些大项目中,Intellisense有时会“丢失”。为什么?不知道。

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

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

答案 2 :(得分:6)

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

Rebuilding Intellisense

答案 3 :(得分:4)

您是否安装(或卸载)了任何加载项?我发现这种效果是我的智能感知。

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

答案 4 :(得分:2)

  

我不使用VS2008 for C ++,只使用VB& C#,但我发现当intellisense停止工作时(对VS2003 / 2005/2008来说是真的),这是因为项目/文件中的某些内容被破坏了 - 通常是错误的引用或代码。

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

C ++必须遍历函数原型的包含文件,如果路径不正确,它将找不到所有的原型头。

答案 5 :(得分:2)

在糟糕的重构实用程序切碎我的代码后,我需要修复itellisense。问题是一个类头文件,其中包含一个#include。递归引用破坏了itellisense。这种情况的一个症状是,如果itellisense可以看到其他类而不是当前类。也:

使用#pragma一次消除重复的标头加载

如果项目现在需要花费更长的时间来加载,那么就会感觉到感知到导致缺乏完成支持的冲突。

通常只有一个受影响的类对象,这会显示要查看的文件(通常是标题)。

答案 6 :(得分:1)

@ John Richardson / @ Jonathan Holland

我的包含设置正确,没有任何问题。我也尝试了几次NCB重建,但它从未修复过100%。

我感觉可能与类的前向声明有关。例如为了降低头文件中包含的复杂性,我们通常会执行以下操作:

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

我想知道是不是搞砸了?还有其他想法吗?你的项目越大,肯定会越糟。

答案 7 :(得分:1)

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

#ifndef CLASS_H
#define CLASS_H
...
#endif

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

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

就足够了
#pragma once 

在头文件的开头仍然避免重新定义并让Intellisense再次工作=)=)

至少,这对我有用,希望它有用......

干杯 弗朗西斯

答案 8 :(得分:1)

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

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

  • 如果破坏Intellisense的头文件在项目中,但不是#include d,它仍可在其余文件中使用
  • 如果包含它们,但没有使用内部声明的类型,它仍然有效
  • 如果它们被包含并且使用了一个声明里面的类型,它可能仍然有效(成员没有Intellisense,发生给定类型后没有Intellisense,但至少是全局名称和参数信息)
  • 如果Intellisense在一个.cpp文件中被破坏,它仍然可以在其他没有包含或使用有问题的代码的情况下工作(但我想如果它崩溃了,它会被整个项目禁用,尽管那样做了不会发生在我身上)
  • Intellisense似乎在成功编译后更新(有时不在之前)
  • 将损坏的代码放入#if 0/* .. *///中的任何内容似乎让Intellisense放心了

从我使用的C ++功能中,实际上只有少数几个断开Intellisense:

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

似乎其中一些问题是由于某些“简化”解析造成的,这种解析不如正确的C ++解析器强。有了上述信息,就可以在现有代码中使用Intellisense的“可靠”方法:

  1. 设置一个空项目(一个控制台应用程序),在其中创建带有虚拟void main() {}的Main.cpp。
  2. 包含一个损坏的标头文件和math.h
  3. 构建(必须编译,以便Intellisense可靠地更新)
  4. 通过键入例如Intellisense来测试Intellisense是否有效sin(并查看是否弹出了参数帮助。有时,这会起作用,但成员帮助不会 - 所以也试试。
  5. 在头文件中创建一个实例,构建,看看是否设法杀死IS。
  6. 从罪魁祸首文件中删除代码并转到第3步
  7. 找到并修复有问题的代码后,将第5步中删除的代码放回去,再试一次
  8. 在使全班工作顺利之后,制作下一堂课的实例,依此类推......
  9. 我发现通过这种方式可以很容易地确定出现问题的代码位置(我意识到这对于真正的大型项目来说可能是不可行的,在我的情况下,只有97个问题中的单个文件存在问题)。请注意,这里的“Build”是指编译,链接阶段不需要完成,因此未解析的外部是可以的,IS应该更新。

    更新IS(除了构建)的另一种方法是保存所有内容,关闭工作区,删除.ncb文件并重新打开它。然后等待'更新智能感知......(N)'从状态栏中消失(N计为零,如果它不是一直进行,它会显示出现问题的进度)。我觉得这很乏味。

答案 9 :(得分:0)

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

#include <myfile.h> 

我解决了这个问题:

#include "myfile.h"

intellisense开始正常工作后! 我希望这可以帮助你!

答案 10 :(得分:0)

我不得不重置设置......

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

thread on this here

答案 11 :(得分:0)

问题在于.vcproj文件。

你会发现如果你从调试模式切换到发布模式,构建,然后尝试intellisense它经常工作。

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

重新打开你的项目,让Intellisense完成建设,然后它应该被修复。