Visual Studio预处理器只在/P设置时工作

Visual Studio preprocessor only works if /P is set

本文关键字:设置 工作 Studio 预处理 处理器 Visual      更新时间:2023-10-16

我在Visual Studio 2008中遇到了一个尴尬的问题。我试图定义一个字符串到枚举映射使用配置头(称之为param_definitions .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,这样我就有办法诊断出哪里出了问题。当我这样做时,文件编译成功。

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

由于您没有向我们展示输出实际是什么样子,我将猜测:您在#define DEFINE_ITEM( NAME, TYPE ) params[ #NAME ] = NAME末尾缺少分号,这导致生成的代码看起来像这样:

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

添加分号,如果没有帮助,请编辑更详细的问题

相关文章: