gcc和vc2008都支持宏字符串链接,下面是一个小例子:
#define PRINT_STR(string) printf(#string);
int main(){
PRINT_STR("appleleaf \n");
return 0;
}
出乎意料的是,打印的结果是:
"appleleaf \n",没有换行,还多了两个括号
使用-E展开宏可以看出来宏被翻译为
printf("\"appleleaf \\\\n\"");;
只有这么写才能正确输出:
PRINT_STR(appleleaf \n);
也就是去掉字符串前后的括号。
对于这样的预处理是实现,我设计了一个小case, 想要打印appleleaf回车后再打印abcd:
PRINT_STR(appleleaf \n, abcd);这样显然不行,是两个参数,且第二个参数code引用有问题,linux下面引用不到。
PRINT_STR(“appleleaf \n, abcd”);这样也不行。
预处理器的设计者最初为何设计这种违背直观的替换方案,我还是觉得奇怪。