【问题标题】:Visual Studio preprocessor only works if /P is setVisual Studio 预处理器仅在设置 /P 时才有效
【发布时间】: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 所以我有一些方法来诊断出了什么问题。当我这样做时,文件编译成功。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我没有意识到它也抑制了编译。
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多