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

时间:2011-07-28 11:43:25

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

我在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 个答案:

答案 0 :(得分:2)

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

由于你没有告诉我们输出实际上是什么样的,我猜测:你在#define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME的末尾丢失了分号,这导致生成的代码如下所示: / p>

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

添加分号,如果这样做没有帮助,请使用更多详细信息编辑问题。