无效的预处理令牌

时间:2018-11-25 08:28:26

标签: c++

以下示例是从我的真实代码中提取的,它模拟了我刚遇到的错误:

#include <stdio.h>

class CPair
{
public:
    typedef enum {UNKNOW = 0, STRING, YESNO, NUMBER, FLOAT}  TYPE;
};

#define PRT(t)                  \
    printf("%d\n", CPair::##t);

int main()
{
    PRT(NUMBER)
    return 0;
}

我正在MacOS上编译该程序:

$ c++ -v
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

并获得以下代码:

$ c++ t.cpp
t.cpp:14:2: error: pasting formed '::NUMBER', an invalid preprocessing token
        PRT(NUMBER)
        ^
t.cpp:10:24: note: expanded from macro 'PRT'
        printf("%d\n", CPair::##t);
                              ^
1 error generated.

此代码是从我与Linux g ++编译器一起使用的旧代码中复制的。有什么问题吗?

1 个答案:

答案 0 :(得分:7)

串联的结果必须是单个预处理令牌。而且此类令牌不能包含::,它必须是有效的标识符。

立即修复很简单,因为您根本不需要令牌粘贴:

#define PRT(t)                  \
    printf("%d\n", CPair::t);