Visual Studio 预处理器仅在设置 /P 时才有效

Posted

技术标签:

【中文标题】Visual Studio 预处理器仅在设置 /P 时才有效【英文标题】:Visual Studio preprocessor only works if /P is set 【发布时间】:2011-07-28 11:43:24 【问题描述】:

我在 Visual Studio 2008 中遇到了一个尴尬的问题。我正在尝试使用如下所示的配置标头(称为 param_defines.h)文件定义字符串到枚举的映射:

DEFINE_ITEM( A, BOOLEAN )
DEFINE_ITEM( B, INT )
DEFINE_ITEM( C, INT )

等等。然后在第二个头文件 (enums.h) 中引用它:

enum ParamType

    BOOLEAN = 0,
    INT
;

enum Param

    UNKNOWN = -1
#define DEFINE_ITEM( NAME, TYPE ) ,NAME
#include "param_defines.h"
#undef DEFINE_ITEM
;

然后在第三个(源)文件中我这样做:

#include "enums.h"
std::tr1::unordered_map<std::string, int> params;
#define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME
#include "param_defines.h"
#undef DEFINE_ITEM

当我编译源文件时,会出现很多错误,例如:

error C2065: 'A': undeclared identifier
error C2065: 'B': undeclared identifier
error C2065: 'C': undeclared identifier

所以预处理器发生的事情并没有完全按照我的意愿去做。

关键是这个。我设置 /P 所以我有一些方法来诊断出了什么问题。当我这样做时,文件编译成功。

【问题讨论】:

【参考方案1】:

不,它根本无法编译。 /P 禁止编译(文件只是预处理,此时没有语法检查),就像/c 禁止链接一样。

由于您没有向我们展示输出的实际样子,我猜想:您在#define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME 末尾缺少分号,这导致生成的代码如下所示:

params["foo"] = foo
params["bar"] = bar
// ...

添加分号,如果没有帮助,请编辑问题并提供更多详细信息。

【讨论】:

谢谢。我没有意识到它也抑制了编译。

以上是关于Visual Studio 预处理器仅在设置 /P 时才有效的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Visual Studio 中报告 C 警告

Visual Studio:调试时重置用户设置

仅在 Visual Studio 中激活时才调用后台任务

仅在 Visual Studio 2010 中存在可延迟迭代器的问题

日期选择器仅在聚焦时显示错误

OpenGL 程序仅在 Visual Studio 2013 中的调试模式下工作