#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);

10-08 11:05