【问题标题】:How to get IntelliSense to reliably work in Visual Studio 2008如何让 IntelliSense 在 Visual Studio 2008 中可靠地工作
【发布时间】:2010-09-07 13:22:05
【问题描述】:

有谁知道在 C/C++ 项目中工作时如何让 IntelliSense 可靠地工作?它似乎适用于大约十分之一的文件。 Visual Studio 2005 似乎比 2008 好很多。

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

How to get IntelliSense to reliably work in Visual Studio 2008

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

【问题讨论】:

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


    【解决方案1】:

    Native C++ intellisense 在任何版本的 Visual Studio 中都不能可靠地工作。我发现有两个常见的问题:

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

    还有,

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


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

    【讨论】:

    • 这是删除 ncb 文件的有用解决方案。 :)
    • 注意:智能感知在 VS2010 中已修复。
    • 该死的,微软!我在这个项目中有 544 个#includes(不包括其中嵌套的#includes 和无数的#defines。)修复你的 s&^*!感谢海报的想法。
    • +1 删除 sdf(VS2010 对 08 年 ncb 的新扩展)对我有用。我关闭VS解决方案,删除解决方案的SDF文件,重新打开解决方案,重新构建解决方案,瞧。
    【解决方案2】:

    我不将 VS2008 用于 C++,仅使用 VB 和 C#,但我发现当智能感知停止工作时(对于 VS2003/2005/2008 来说是这样),这是因为项目/文件中的某些内容已损坏 - 通常是错误的参考或代码。

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

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

    【讨论】:

      【解决方案3】:

      @John Richardson/@Jonathan Holland

      我的包含设置正确,没有问题。我也尝试过多次重建 NCB,但始终无法 100% 修复。

      我感觉这可能与类的前向声明有关。例如为了减少头文件中包含的复杂性,我们通常会这样做:

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

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

      【讨论】:

        【解决方案4】:

        您是否安装(或卸载)了任何插件?我发现这会影响我的智能感知。

        除了确保您的工具->选项->文本编辑器->所有语言“自动列表成员”和“参数信息”被选中。

        【讨论】:

        • 谢谢,这帮助我弄清楚了 Intellisense 为何神秘停止工作!
        • 我的“所有语言”设置显示绿色方块而不是复选标记(可能是因为它们仅针对某些语言设置)。单击它们以便检查它们为我解决了问题。
        【解决方案5】:

        我还意识到,在某个大型项目中,Intellisense 有时会“迷失”。为什么?不知道。

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

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

        【讨论】:

        • +1 了解如何禁用智能感知。我在 2005 年用于禁用的宏在 2008 年不再起作用。
        • 我在别处读到,应该谨慎处理删除该 dll 的操作,最好创建一个名为“Solutionname.ncb”的文件夹。虽然在每次启动时都会产生 annyoing 错误消息。并 +1 提及 VAX。
        • 这仍然是 VS2010 的好建议,因为 VS2010 中的智能感知非常慢(尽管现在可以使用 VS 中的配置页面禁用智能感知)
        【解决方案6】:

        对于我们这些无法获得视觉辅助的人来说,似乎有希望了:

        Rebuilding Intellisense

        【讨论】:

        • 但是VS2010的第一个版本不支持C++/CLI :/
        【解决方案7】:

        在那个糟糕的重构实用程序破坏了我的代码之后,我需要对 itellisense 进行修复。问题是一个包含自身#include 的类头文件。递归引用会破坏 itellisense。这种情况的一个症状是,如果 itellisense 可以看到其他类,但看不到当前类。另外:

        使用#pragma once 消除重复的标题加载

        如果项目现在需要更长的时间来加载,那么 itellisense 会试图弄清导致的冲突,然后缺乏完成支持。

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

        【讨论】:

          【解决方案8】:

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

          #include <myfile.h> 
          

          我解决了这个问题:

          #include "myfile.h"
          

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

          【讨论】:

            【解决方案9】:

            我不得不重置设置...

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

            thread on this here

            【讨论】:

              【解决方案10】:

              我有一个非常烦人的问题,智能感知只在某些文件中工作,没有任何明显的原因……我花了几个小时在谷歌上挖掘,但我终于明白原因确实是递归引用! 我使用的是:

              #ifndef CLASS_H
              #define CLASS_H
              ...
              #endif
              

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

              但是注释 ifndef-define-endif 并放一个:

              #pragma once 
              

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

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

              干杯 弗朗切斯科

              【讨论】:

                【解决方案11】:

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

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

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

                从我使用的 C++ 特性来看,实际上只有少数破坏了 Intellisense:

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

                其中一些问题似乎是由于某些“简化”解析造成的,它不如适当的 C++ 解析器强大。有了上面的信息,让 Intellisense 在现有代码中工作的“可靠”方法:

                1. 设置一个空项目(控制台应用),创建 Main.cpp,其中包含虚拟 void main() {}
                2. 包括一个损坏的头文件和math.h
                3. 构建(它必须编译,以便 Intellisense 可靠地更新)
                4. 通过键入例如测试 Intellisense 是否正常工作sin( 并查看参数帮助是否弹出。有时,这会起作用,但会员帮助不起作用 - 所以也试试吧。
                5. 在头文件中创建一个实例,构建,看看是否能杀死 IS。
                6. 从罪魁祸首文件中删除代码并转到第 3 步
                7. 找到并修复有问题的代码后,将第 5 步中删除的代码放回原处,再试一次
                8. 在使整个类运行良好后,为下一个类创建一个实例,依此类推...

                我发现这种方法很容易查明产生问题的代码的位置(我意识到这对于真正的大型项目可能是不可行的,在我的例子中,97 个文件中只有一个文件出现问题)。注意这里的'Build'是指编译,链接阶段不需要完成,所以未解析的外部是可以的,无论如何IS都应该更新。

                另一种更新 IS(除了构建)的方法是保存所有内容,关闭工作区,删除 .ncb 文件并重新打开它。然后等待“正在更新 Intellisense ... (N)”从状态栏中消失(N 计数为零,如果它没有一直走下去,它会显示问题发生的进度)。我觉得这很乏味。

                【讨论】:

                  【解决方案12】:

                  问题出在 .vcproj 文件上。

                  你会发现如果你从调试模式切换到发布模式,构建,然后尝试智能感知,它通常可以工作。

                  关闭 Visual Studio。如果您在项目中搜索 .vcproj 文件,请编辑它们并搜索 AdditionalIncludeDirectories 的前两个实例。此值应类似于“..\,..\”而不是“../..”。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-11-21
                    • 1970-01-01
                    • 2019-07-05
                    • 2017-01-07
                    • 1970-01-01
                    相关资源
                    最近更新 更多