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

Posted

技术标签:

【中文标题】可以在 #ifndef ... #endif 等预处理器指令块中的 VS2008 中启用智能感知吗【英文标题】:Can intellisense be enabled in VS2008 within preprocessor directive blocks like #ifndef ... #endif 【发布时间】:2010-08-18 18:06:32 【问题描述】:

在 C++ 库中工作时,我注意到在“#ifndef CLIENT_DLL ... #endif”之类的指令块中我没有获得任何智能感知。这显然是由于已经定义了“CLIENT_DLL”这一事实。我意识到我可以通过简单地注释掉指令来解决这个问题。

是否有任何智能感知选项可以启用智能感知,而不管指令评估如何?

【问题讨论】:

没有旋钮可以调整它。 VS2010 大改写。 我意识到这可能不是您要寻找的答案,但 Visual Assist X 的代码建议在 #if 中工作得很好。它不是免费的,但它是一个非常好的插件,我不想再没有它了。 【参考方案1】:

得到你想要的,你会失去很多。

Visual C++ IntelliSense 基于几个主要假设 1. 你想要好的/可用的结果。 2. 您当前的 IntelliSense 编译器将显示与您当前所处的“配置”相关的信息。

由于您当前的配置具有该预处理器指令,因此您将无法从 #ifndef 区域获得结果。

如果您仔细考虑,原因是有道理的。如果 IntelliSense 编译器只是尝试编译您所在的区域,而不考虑 #ifdef 区域怎么办?你会得到废话和不可编译的代码。它将无法使您的compiland正面或反面。

我可以想象一个非常复杂的解决方案,它在您所在的区域上运行一个较小的(新的)解析,只有该区域被假定为 compiland 的一部分。但是,这种方法有很多漏洞(就像该区域中没有任何东西被声明/定义一样),这种可能的方法会立即让您感到沮丧,除非在非常非常简单的情况下。

通常最好避免 #ifdef 区域中的逻辑,而是将参数化编译的使用委托给整个函数,以便编译器的前端始终编译这些模块,但链接器/优化器将选择稍后更正 OBJ。

希望对您有所帮助, 会

【讨论】:

【参考方案2】:

Visual Studio 6.0 在某些领域中对 C++ 提供了更好的支持,例如这个。如果您需要智能感知,则只需暂时将其注释掉,构建然后您就应该拥有智能感知。如果这是您的意图,请记住在完成后推荐它。

【讨论】:

【参考方案3】:

我只是希望 Intellisense 能够在 VS2008 中正常工作。 MS“解决方法”在大多数情况下都不起作用(删除 .ncb 文件)。哦, here's another SO discussion...,让我们看看 IT 怎么说(我就是这么喜欢)

【讨论】:

【参考方案4】:

我也经常对此感到恼火......但我想知道智能感知是否真的能够提供任何有用的信息,一般来说,在条件输出块内?

我看到的问题是,如果变量或函数的使用根据预处理器指令的值而改变,那么它的定义也可能如此。如果像“转到定义”这样的代码浏览功能在条件输出块中处于活动状态,您是否希望它们引导到当前启用的定义或被与您正在查看的禁用代码相同的预处理器条件禁用的定义在?

我认为“最不意外的原则”表明当前的行为是最安全的,尽管它很烦人。

【讨论】:

【参考方案5】:

为什么要在代码中显式地做? VS 中已经有配置设置以及启用和禁用智能感知的方式。 查看链接。

http://msdn.microsoft.com/en-us/library/ms173379(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ks1ka3t6(v=VS.80).aspx

此链接可能对您有所帮助。

【讨论】:

以上是关于可以在 #ifndef ... #endif 等预处理器指令块中的 VS2008 中启用智能感知吗的主要内容,如果未能解决你的问题,请参考以下文章

#ifndef/#define/#endif使用(转载)

c++#ifndef 的作用,高分在线等,举例!

#ifndef #define #endif

#ifndef.#define, #endif 的用法

使用 #pragma once 或 #ifndef #endif 哪个更有效?

#ifndef#define#endif防止头文件重复包含