【问题标题】:Why is this breaking Visual Studio's Intellisense?为什么这会破坏 Visual Studio 的 Intellisense?
【发布时间】:2011-11-19 11:57:19
【问题描述】:

有谁知道为什么 Visual Studio 2008 的 Intellisense 表现得很有趣?

如果我说BEGIN_MSG_MAP,我会得到:

如果我说BEGIN_MSG_MAP_FOO,我会得到:

不管怎样,宏都是未定义的,那有什么关系呢?

不,我没有在任何地方使用 Force Include,所以这是实际的整个源文件 - 几乎没有任何定义,如下所示:

【问题讨论】:

  • 你确定它们都是未定义的吗?
  • @Daniel:查看新截图。
  • 所以,您问“为什么 IntelliSense 不适用于我编写的这个无效代码?”值得一提的是,Visual C++ 2010 中的 IntelliSense 并未提供任何代码示例的完成列表。
  • @James:我认为你没有抓住重点。 两个都是无效的,因为我没有包含任何东西。但 Intellisense 适用于 BEGIN_MSG_MAP,而 not 适用于 BEGIN_MSG_MAP_FOO。为什么会这样做?
  • @James:另一方面,一些产品的内部结构通常或多或少地公开披露(如果在某些 MS 上找到一些关于 IntelliSense 改进的内部工作的通用描述,我不会感到惊讶)博客)。

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


【解决方案1】:

也许END_MSG_MAP() 有一个},它关闭了CMyDialog 的范围,因此test() 将在全局范围内。查看下拉列表。正是如此。

【讨论】:

  • 不,这是一个未定义的宏。我没有任何 #includes 它。
  • 是的,我同意,我马上就拿回来了。 :) 但这绝对不是正确的答案。
  • 你确定你的编译器设置不包括atl吗?
  • 它不应该是......它说Not Using ATL,而我在Force Includes 或其他任何东西中都看不到任何东西。
【解决方案2】:

注意:此答案完全基于推测,如果有人根据 IntelliSense 工作原理的实际知识发布了一个好的答案,我很乐意投票并删除我的。

我认为 IntelliSense 有一些特殊情况可以默认处理最常见的 MFC/ATL 宏,或者它可能假设可能包含一些默认标头以能够处理您的文件的事实,即使它没有t 包含 MFC 标头,可以包含在已包含此类默认标头的 .cpp 中(通常在标头中看到,即使它们应该包含它们的依赖项)。

但是BEGIN_MSG_MAP_FOO 是一个完全未知的宏,它开始表现得很有趣,因为它实际上是一个未知的标识符,可能被解释为一些可以关闭当前范围的未知宏。因此,在它之后,它“安全行事”并重新开始解析,因为它是一个新文件的开头,并认为test 是一个全局函数(如左上角组合框所证明的那样),其中this 使没有意义。

【讨论】:

  • 这绝对是一种可能性,但我不禁想知道:BEGIN_MSG_MAP 有什么特别之处,值得这样做?它似乎不需要任何形式的特殊支持......
  • MFC 项目实际上充满了它,训练 IntelliSense 至少知道它们不会改变当前范围可能是个好主意。
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多