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 #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()
尚未声明。毕竟是在<stdio.h>
/<cstdio>
中声明的。
所以 Intellisense 不显示它是正确的。 ;)
在顶部添加#include <stdio.h>
的好处是不需要using namespace std;
,因为<stdio.h>
将名称放在全局命名空间中(也可能在std:: 命名空间中)。
更新:这并不能解释为什么在输入“std::pri”后会出现“std::printf”。
UPDATE2:经过测试,很明显ctrl-space强制时会提示printf
。也许问题是为什么 Intellisense 不会自动弹出?
【讨论】:
这种类型的 C++ 智能感知只会在你按 ctrl+space 后出现。
商业扩展 Visual Assist X 提供的体验可能更符合您的需求(请注意,Visual Studio 的快速版本不支持它)。
【讨论】:
以上是关于VS2010 中的 C++ 智能感知的主要内容,如果未能解决你的问题,请参考以下文章