#和##是两个预处理运算符
1.记号串化(#)
记号串化的作用是把函数式宏定义中的实参转换为字符串。
当替换列表中有'#'时,紧跟其后的记号必须是当前宏的参数。在与处理中,'#'连同它后面的参数被实例取代。例如
#include <stdio.h>
#define PSQR(x) printf("the square of "#x" is %d. \n",((x)*(x)))
int main(){
int y = 5;
PSQR(y);
PSQR(3*2);
return 0;
}
res:
2.记号黏结(##)
##运算符可用于函数式宏的替换部分,把两个记号组合成一个记号。
总的来说,记号黏结的作用是将几个预处理记号合并为一个;需要注意##不能位于替换列表的开头或结尾
#include <stdio.h>
#define XNAME(n) x##n
#define PRINT_XN(n) printf("x"#n" = %d\n",x##n);
int main(){
int XNAME(1)=12;
int XNAME(2)=34;
int x3 = 2333;
PRINT_XN(1);
PRINT_XN(2);
PRINT_XN(3);
return 0;
}
res:
3.例子
#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("h(f(1,2))展开为:%s\n",h(f(1,2)));
printf("g(f(1,2))展开为:%s\n",g(f(1,2)));
return 0;
}