以下示例是从我的真实代码中提取的,它模拟了我刚遇到的错误:
#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 ++编译器一起使用的旧代码中复制的。有什么问题吗?
答案 0 :(得分:7)
串联的结果必须是单个预处理令牌。而且此类令牌不能包含::
,它必须是有效的标识符。
立即修复很简单,因为您根本不需要令牌粘贴:
#define PRT(t) \
printf("%d\n", CPair::t);