#是在宏定义中将参数进行字符串化的预处理特征
##是连接符
##的坑, 阻塞另一个宏的展开
以下的写法是达不到预期效果的,编译会报错
#define Join(x, y) x##y
// 预期是 int x0;
// 但实际是 int x__COUNTER__;
// 因为##阻塞了__COUNTER__的展开
// 最终导致了 x0未定义报错
int Join(x, __COUNTER__);
int main() {
x0 = 10;
return 0;
}
正确写法(需要中间在加一层宏定义)
#define JOIN_FINAL(x, y) x##y
#define JOIN_MID(x, y) JOIN_FINAL(x, y)
#define JOIN(x) JOIN_MID(x, __COUNTER__)
int JOIN(x);
int main() {
x0 = 10;
return 0;
}