40

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

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

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

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

4

12 回答 12

32

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

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

和,

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


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

于 2008-09-02T13:33:01.607 回答
27

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

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

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

于 2008-09-02T14:02:01.240 回答
6

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

重建智能感知

于 2009-05-29T18:18:46.310 回答
4

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

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

于 2008-09-02T14:01:50.430 回答
2

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

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

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

于 2008-09-02T13:36:33.547 回答
2

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

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

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

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

于 2010-10-15T01:03:53.550 回答
1

@约翰·理查森/@乔纳森·霍兰德

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

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

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

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

于 2008-09-02T13:41:26.873 回答
1

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

#ifndef CLASS_H
#define CLASS_H
...
#endif

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

但是评论 ifndef-define-endif 并添加以下内容就足够了:

#pragma once 

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

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

干杯弗朗西斯科

于 2011-06-02T09:51:00.627 回答
1

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

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

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

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

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

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

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

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

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

于 2013-12-05T10:26:17.340 回答
0

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

#include <myfile.h> 

我用以下方法解决了这个问题:

#include "myfile.h"

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

于 2011-03-28T07:45:30.100 回答
0

我不得不重置设置...

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

在这里讨论这个

于 2011-05-11T08:33:07.823 回答
0

问题出在 .vcproj 文件上。

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

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

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

于 2014-02-12T11:33:35.310 回答