#运算符将宏的一个参数转换为字符串字面量,它仅允许出现在带参数的宏的替换列表中。
例如:使用PRINT_INT宏作为一个快捷的方法来整形变量或者表达式的值,#运算符可以使PRINT_INT为每个输出的值添加标签:
#define PRINT_INT(n) printf(#n " = %d\n", n)
n之前的#运算符通知预处理器根据PRINT_INT的参数,创建一个 字符串字面量,因此,调用PRINT_INT(i/j);就会变成:
printf("i/j" " = %d\n",i/j)
又因为C语言中相邻的字符串字面量会被合并,所以,上面语句等价于:
printf("i/j = %d\n",i/j)
##运算符可以将两个记号“ 粘和”在一起,成为一个记号,如果其中一个是宏参数,“粘和”会在形式参数被相应的实际参数替换后发生。如一下宏:
#define MK_ID(n) i##n
当其被调用时,(比如:MK_ID(1)),预处理器首先适用实际参数1替换形式参数n,然后,将i和其粘和,即成为:i1
##运算符的一个应用实例:构造多个版本的max函数:
#define GENERIC_MAX(type) \
type type##_max(type x,type y) \
{ \
return x > y ? x:y; \
} \