关于C ++:如何使IntelliSense在Visual Studio 2008中可靠地工作

关于C ++:如何使IntelliSense在Visual Studio 2008中可靠地工作

How to get IntelliSense to reliably work in Visual Studio 2008

有谁知道在C / C ++项目中工作时如何使IntelliSense可靠地工作? 似乎可以在十分之一的文件中工作。 Visual Studio 2005似乎比2008年要好很多。

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

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

如果我想要一个不错的IntelliSense系统,可能是最好的选择。


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

1)头文件路径设置不正确。当您发现一种类型的intellisense无法正常工作时,请使用IDE单击每个头文件以查找包含该类型的头文件。 (右键单击#include,然后选择"打开文档..."。)。如果在访问声明类型的文件之前失败,那么这就是您的问题。确保正确设置头文件搜索路径。

和,

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

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


我还意识到,在某些大型项目中,Intellisense有时会"丢失"。为什么?不知道。

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

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


对于那些无法获得Visual Assist的人来说,似乎充满了希望:

重建智能感知


您有安装(或卸载)任何加载项吗?我发现这会影响我的智力。

除此之外,只需确保已选中工具->选项->文本编辑器->所有语言"自动列表成员"和"参数信息"。


在糟糕的重构实用程序切碎我的代码之后,需要对itellisense进行修复。问题是类头文件本身包含#include。递归引用破坏了itellisense。这种现象的一个征兆是itellisense是否可以看到其他类,但不能看到当前的类。也:

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

如果现在加载该项目需要更长的时间,那么itellisense试图弄清正在引起的冲突,那么将缺少完成支持。

通常它只是一个受影响的类对象,它向您显示要查看的文件(通常是标头)。


I don't use VS2008 for C++, only VB & C#, but I find that when intellisense stops working (true for VS2003/2005/2008) it's because something in the project/file is broken - usually a bad reference or code.

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

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


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

假设存在一个文件,其中包含"破坏" Intellisense的代码,

  • 如果破坏Intellisense的头文件在项目中,但不是#include d,则它在其余文件中仍然有效
  • 如果包含它们,但未使用内部声明的类型,则它仍然有效
  • 如果将它们包括在内并且使用在内部声明的类型,它可能仍会起作用(成员没有Intellisense,给定类型出现后没有Intellisense,但之前至少是全局名称和参数信息)
  • 如果Intellisense在一个.cpp文件中损坏,它仍然可以在不包含或使用有问题的代码的其他文件中工作(但我想如果它崩溃很严重,它将在整个项目中被禁用,尽管这并没有发生我)
  • 成功编译后,Intellisense似乎已更新(有时未更新)
  • 将损坏的代码放入#if 0/* .. *///中的任何一个似乎可以使Intellisense轻松自如

从我使用的C ++功能来看,实际上只有几个中断了Intellisense:

  • 与模板参数中的'>'或'> ='进行比较(例如static_assert<(size > 0)>)

    • 使用双括号无法解决(static_assert<((size > 0))>无济于事)
    • 通过使用'<'或'<='代替(static_assert<0 < size>可以解决)
    • 通过将值存储在枚举中并使用它来专门化模板来解决
  • 显式函数模板特化会禁用参数信息(例如function(args))

    • 可能无法解决(也许包装在宏中),但是我可以忍受它被破坏
  • 模板成员类型的实例化,例如Matrix::MakeMatrixType<3, 3>::Result r;

    • 很难弄清楚为什么会发生这种情况(可能是由于使用了Eigen)
    • 解决方法是将这样的代码移动到一个单独的.cpp文件中,在该文件中IS无法正常工作(并非始终可行)

似乎其中一些问题是由于某些"简化的"解析所致,而解析能力不如适当的C ++解析器强。掌握了以上信息,就可以使Intellisense在现有代码中运行的"可靠"方法:

  • 设置一个空项目(一个控制台应用程序),在其中创建一个虚拟void main() {}的Main.cpp。
  • 包括一个损坏的头文件和math.h
  • 构建(必须编译,以便Intellisense可靠地更新)
  • 通过键入以下内容来测试Intellisense是否正常运行sin(并查看是否弹出参数帮助。有时,这会奏效,但会员的帮助却不会-因此也请尝试。
  • 在头文件中创建一个实例,进行构建,看看是否可以杀死IS。
  • 从罪魁祸首文件中删除代码,然后转到步骤3
  • 找到并修复有问题的代码后,请放回在步骤5中删除的代码,然后重试
  • 在使整个类正常工作之后,创建下一个类的实例,依此类推...
  • 我发现用这种方法可以很容易地查明出现问题的代码的位置(我意识到这对于真正的大型项目可能不可行,在我的案例中,只有97个问题中只有一个文件)。请注意,这里的"构建"是指编译,链接阶段不需要完成,因此未解决的外部问题没关系,无论如何都应该更新IS。

    更新IS(而非构建)的另一种方法是保存所有内容,关闭工作区,删除.ncb文件并重新打开它。然后等待"更新Intellisense ...(N)"从状态栏中消失(N计为零,如果未完全完成,则会在出现问题时显示进度)。我觉得这很乏味。


    我遇到了一个非常烦人的问题,intellisense仅在某些文件中工作,没有任何明显的原因……这花了我几个小时的时间来研究google,但是我终于明白了,原因确实是递归引用!
    我正在使用:

    1
    2
    3
    4
    #ifndef CLASS_H
    #define CLASS_H
    ...
    #endif

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

    但这足以注释ifndef-define-endif并添加以下内容:

    1
    #pragma once

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

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

    干杯
    弗朗切斯科


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

    我的包含物安装正确,那里没有问题。我也尝试过几次NCB重建,但从未100%修复。

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

    1
    2
    3
    4
    5
    6
    7
    class MyPredeclared;

    class SomeOtherClass
    {
    private:
        MyPredeclared* m_pPointer;
    }

    我不知道这是否会解决问题?还有其他想法吗?项目越大,肯定越差。


    问题在于.vcproj文件。

    您会发现是否从调试模式切换到发布模式,进行构建,然后尝试intellisense通常有效。

    关闭Visual Studio。 如果您在项目中搜索.vcproj文件,请对其进行编辑并搜索AdditionalIncludeDirectories的前两个实例。 其值应类似于" .. ,...."而不是" ../ .."。

    重新打开您的项目,让Intellisense完成构建,然后应将其修复。


    我不得不重置设置...

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

    线程在这里


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

    1
    #include <myfile.h>

    我用以下方法解决此问题:

    1
    #include"myfile.h"

    智能感知后,开始正常工作!
    希望对您有所帮助!


    推荐阅读