VS2010 中的 C++ 智能感知

Posted

技术标签:

【中文标题】VS2010 中的 C++ 智能感知【英文标题】:Intellisense for C++ in VS2010 【发布时间】:2011-08-01 11:29:16 【问题描述】:

全部,

我对 C++ 项目的 Intellisense 有一个奇怪的问题。背景:我最近安装了 VS2010 Sp1,并且在 SQL Server 2008 R2 中丢失了 Intellisense。我尝试按照建议安装累积更新 7 (CU7),但没有成功。但是,重新安装 SQL Server 2008 R2 确实如此。然后我使用 CU7 为 SQL Server 2008 R2 进行了更新,一切都很好。现在 Intellisense 对 C# 项目工作得很好,但现在对于 C++ 项目,它并不能正常工作(注意:C++ 项目是不是 C++/CLI)。

我已禁用预编译标头(“不使用预编译标头”)并包含以下内容:

#include <cmath>
#include <complex>
#include <iostream>
#include "stdafx.h"
#include "globals.h"

using namespace std;

注意:我知道使用 std 命名空间并不总是被认为是最佳实践,但在这里它会节省我分配的时间并且不会产生歧义。

所以现在当我想要一个 printf 语句时,例如,如果我键入 printf,我得到的不是 Intellisense 提示。但是,如果我 Ctrl+Space 或 Ctrl+J Intellisense 正在识别该命令,它就会显示出来。下面是 Intellisense 无法自动工作的图像。

现在如果我输入 std::printf,就会出现 Intellisense:

有什么方法可以让 VS2010/Intellisense 知道我想使用 std 命名空间,因为它似乎只是无法识别“#using namespace std;”命令。

非常感谢。

【问题讨论】:

如果你禁用了预编译的头文件,你不妨去掉#include "stdafx.h" 要明确:您希望智能感知在您开始输入“p”后立即弹出,而不是在某个可识别的标记处(即在到达“printf(”)之后?如果是这样,我不认为有任何方法可以做到这一点- ctrl+space 尽可能接近。 不记得我在哪里读到的,但是 VC++ Intellisense 在 VS2010 中使用预编译头文件效果更好。甚至有一些临界情况,其中某些功能仅适用于预编译的标头。当我试图弄清楚为什么我的 VS 2010 与 VS 2008 相比如此缓慢时,我看到了这一点。为什么你禁用了 pch? 使用预编译头文件时,代码将无法编译。它抱怨 #include 和所有其他包含该问题的语句。它还抱怨使用命名空间 std;。当我删除 pch 时,它会像我预期的那样编译得很好。 @Sjoerd如果我删除了删除pchs的#include“stdafx.h”,我再次收到编译时错误。是的,我希望它像 C# 一样弹出。当我使用 std::printf() 但没有“std::”前缀时它会弹出 - 我认为应该是可能的。 @Camus 使用预编译头文件时,您的#include "stdafx.h" 必须是文件中的第一个#include,这解释了为什么您的编译器会抱怨#include stdafx.h 上方的#include 行。 【参考方案1】:

注意:我的第二个答案。基于 Cory Nelson 的评论,所以我不主张功劳。

如果我理解正确,您希望 Intellisense 在您输入“p”的那一刻弹出。

答案是:不,VS2010 不会这样做

Intellisense 将启动“::p”或“std::p”,但不适用于普通的“p”。这与预编译的标头无关,也与#include 顺序无关。就是不会。

我过去使用过的一些 IDE 具有在这种情况下启用/禁用完成的设置(我记得在某些 C++ Builder 版本中看到过),但我在 VS2010 中找不到它。

那么为什么 VS2010 不允许呢?关键字可能会导致不值得解决的问题,但这是否是原因?我不知道。也许 VS 团队的成员可以对此有所了解。

更新:

我在一个新的 VS2010 项目中测试了这个程序:

#include <string>
using namespace std;

int main()

    stri

键入“stri”时没有弹出窗口。

“字符串”出现在 ctrl-space 之后的弹出窗口中,并且在我删除 using namespace std; 时不存在,因此它正确地对 using 做出反应。

在输入 :: 后,Intellisense 将激活,在 ::s 建议 SA_AccessType(来自文件 sourceannotations.h)后,该列表显然预先填充了许多系统标头。

如果我输入 if 并强制 Intellisense 弹出,列表中没有 if。如果我随后键入(,就好像我想键入if(,它会更正为ifstream(。因此,如果 Intellisense 总是弹出,键入关键字会更加困难。

【讨论】:

太棒了。非常感谢。总而言之,不要要求太多,继续努力吧!再次感谢...【参考方案2】:

根据您的#include 列表判断,printf() 尚未声明。毕竟是在&lt;stdio.h&gt;/&lt;cstdio&gt;中声明的。

所以 Intellisense 不显示它是正确的。 ;)

在顶部添加#include &lt;stdio.h&gt; 的好处是不需要using namespace std;,因为&lt;stdio.h&gt; 将名称放在全局命名空间中(也可能在std:: 命名空间中)。

更新:这并不能解释为什么在输入“std::pri”后会出现“std::printf”。

UPDATE2:经过测试,很明显ctrl-space强制时会提示printf。也许问题是为什么 Intellisense 不会自动弹出?

【讨论】:

间接包含 的可能性不大。 它是 c++,所以他应该使用 并使用正确的命名空间。 @Bo 可能是,但由于他直接使用该功能,他仍然应该自己包含它。 @RedX - 全部正确。我的目标是答案的“这不能解释......”部分。 @RedX 在 C++ 中, 也是允许的。请参阅***.com/questions/5079325/… 的讨论 @Bo 是的,C++ 标准头文件允许包含其他 C++ 标准头文件。也许 Intellisense 不扫描 C++ 标头,而是使用缓存表示?当然纯属猜测。我不知道发生了什么,所以也许我应该写评论而不是答案......【参考方案3】:

这种类型的 C++ 智能感知只会在你按 ctrl+space 后出现。

商业扩展 Visual Assist X 提供的体验可能更符合您的需求(请注意,Visual Studio 的快速版本不支持它)。

【讨论】:

以上是关于VS2010 中的 C++ 智能感知的主要内容,如果未能解决你的问题,请参考以下文章

C++ VS Express 2010 智能感知

VS.NET C++ 2010 中智能感知和编译器的区别

可以在 #ifndef ... #endif 等预处理器指令块中的 VS2008 中启用智能感知吗

VS2010 RC - 智能感知坏了吗?如何打开它?

VS2010 - HLSL 智能感知?

VS 2013 中的 Dojo 自定义模块智能感知