#include <stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void)
{
int token34 = 40;
tokenpaster(34);
return 0;
}
The output is:
token34 = 40
作者说:
它是如何发生的,因为此示例将导致预处理器的以下实际输出:
printf ("token34 = %d", token34);
如何将
token##n
转换为token34
?不应该是token#34
? 最佳答案
预处理器语句中的双哈希将两个参数粘在一起。所以token##n
变成token##34
变成token34
。一个散列字符串化它的参数。所以#n
变成"34"
。因此,整个宏观扩展如下:
tokenparser(34);
->
printf ("token" #n " = %d", token##n);
->
printf ("token" "34" " = %d", token##34);
->
printf ("token" "34" " = %d", token34);
编译器将格式字符串连接起来,因此最终结果是:
printf ("token34 = %d", token34);