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 时才有效的主要内容,如果未能解决你的问题,请参考以下文章