无效的预处理令牌



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

#include <stdio.h>
class CPair
{
public:
typedef enum {UNKNOW = 0, STRING, YESNO, NUMBER, FLOAT}  TYPE;
};
#define PRT(t)                  
printf("%dn", 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("%dn", CPair::##t);
^
1 error generated.

这段代码是从我使用Linux g++编译器的旧代码中复制的。怎么了?

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

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

#define PRT(t)                  
printf("%dn", CPair::t);

最新更新