【问题标题】:Can I make VC++ Intellisense ignore some things it considers invalid?我可以让 VC++ Intellisense 忽略一些它认为无效的东西吗?
【发布时间】:2013-08-14 17:02:29
【问题描述】:

C++,VS 2012(但同样的事情也发生在之前的 VS 版本中)。

有时,Intellisense 会发现并非真正问题的“问题”,并将其红色波浪线置于完全有效的代码之下。

例子:

class A {
  A(const A&);
  A& operator=(const A&);
public:
  A(const wchar_t*, const wchar_t*, int);
#define AMsg(x) A(x, __FILEW__, __LINE__)
};

...

throw AMsg(L"abc");

AMsg 宏转换为 ctor 调用,节省了键入明显的最后两个参数值,代码按预期工作,但 Intellisense 在 AMsg 下放置一个红色波浪线,表示 A::A(const A&) 不可访问。 A::A(const A&) 是不可访问的,是的,但是 AMsg 调用了不同的 ctor,而 Intellisense 看不到这一点。

有没有办法让 Intellisense 忽略 AMsg?我记得我们可以,例如,编辑存储在文件中的编辑器的关键字列表,也许有一些文件或宏(例如,“不解析这个特定文件的内容”?)有助于控制智能感知?

【问题讨论】:

  • 这是一个正确的诊断,需要复制构造函数将异常对象传播到捕获它的代码。编译器可以在某些情况下优化它是一个实现细节。
  • @Hans Passant:你说得对,我举了一个不好的例子。谢谢你。然而,问题仍然存在,因为在其他情况下 Intellisense 会出错。
  • 我不相信。 Intellisense 现在有一个优秀的编译器,通常的 SO 建议也适用于这里:除非有相反的证据,否则假设错误是在你这边而不是编译器的
  • 现在,我正盯着在不同编译单元中定义两种同名结构类型的代码,其中一个单元中的智能感知从另一个单元中获取类型的定义。我无法在只包含与问题相关的代码的准系统项目中重现这一点,因此必须有一些其他代码干扰,但是(a)我可以看到代码是正确的(引用正确的结构成员),(b ) 编译器可以看到代码是正确的,但是 (c) Intellisense 看不到代码是正确的并且会报错。 (续)
  • Intellisense 抱怨的代码周围的代码可能是错误的,并且编译器只是偶然编译它,但这似乎有点牵强。我同意,尽管 VS 2012 中的 Intellisense 比它在所有以前版本的 VS 中工作得好得多。

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


【解决方案1】:

“问题”是 Intellisense 编译器构建在 EDG 编译器之上,而不是 MSVC 本身。 EDG 的编译器更接近标准,这意味着它今天可以捕捉到 MSVC 明年可能会捕捉到的问题。

无法在您的部分代码库上打开或关闭智能感知。那是没有意义的。假设它会忽略int foo(int),然后编译器会将int foo(int) 包含在重载决议中。你的整个程序可能会改变。

【讨论】:

  • 谢谢。我当然可以看到在代码的某些被大量引用的部分上关闭 Intellisense 会降低其对开发人员的有用性,但我认为为特定的函数调用或宏关闭它(也就是说,不在该调用或宏内部自动完成,并且由于参数的数量/类型而不会扭曲任何东西)不会那么糟糕。也许我错了。
  • @MitchParker:正如 Raymond Chen 所说,每个功能都从 -100 分开始。并且此功能因难以以有用的方式指定而获得额外的罚分。考虑到有限的资源和有限的收益,我完全理解为什么没有更细粒度的控制。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2011-02-23
  • 2016-11-04
相关资源
最近更新 更多