C中的#和##宏

计划1:

#include  #define foo(x, y) #x #y int main() { printf("%s\n", foo(k, l)); //prints kl return 0; } 

计划2:

 #include  #define foo(m, n) m ## n int main() { printf("%s\n", foo(k, l)); //compiler error } 

为什么这两个程序的输出变化如此? 这两个程序之间的确切区别是什么?

#是“字符串化”运算符; 它将其参数转换为字符串文字。

##是“令牌粘贴”操作符; 它将它的两个参数连接成一个标记,不一定是字符串文字。

一个例子:

 #include  #define foo(m, n) m ## n int main(void) { char *kl = "token pasting"; printf("%s\n", foo(k, l)); } 

打印:

 token pasting