下面是一个类函数宏:
#define PSQR (X) printf("The square of X is %d.\n",((X) * (X)));
如果这样使用宏:
PSQR(8);
则输出为:
The square of X is 64.
引号中的字符串中的X被看作普通文本,而不是被看作一个可被替换的语言符号。
1、利用宏参数创建字符串:#运算符
在类函数宏的替换部分中,#符号用作一个预处理运算符,它可以把语言符号转化为字符串。例如,如果X是一个宏参量,那么#X可以把参数名转化为相应的字符串。该过程称为字符串化(stringizing)。例如:
#define <stdio.h>
#define PSQR(x) printf("The square of " #x " is %d.\n",((x) * (x)))
int main(void)
{
int y = 5;
PSQR(y);
PSQR(2 + 4);
return 0
}
输出如下:
The square of y is 25.
The square of 2 + 4 is 36.
第一次调用宏时,用"y"代替#x;第二次调用宏时,用"2 + 4"代替#x。ANSI C的字符串链接功能将这些字符串与printf()语句中的其他字符串组合以产生最终使用的字符串。例如,第一次调用变成:
printf("The square of " "y" " is %d.\n",((y) * (y)));
接着,字符串连接功能将这三个相邻的字符串转换为一个字符串:
"The square of y is %d.\n"
2、预处理器的粘合剂:##运算符
和#运算符一样,##运算符可以用于类函数宏的替换部分。另外,##还可用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。例如:
#define XNAME (n) x ## n
这样下面的宏调用:
XNAME(4)
会展开成如下形式:
x4
程序如下:
#include <stdio.h>
#define SNAME (n) x ## n
#define PRINT_XN (n) printf("x" #n " = %d\n", x ## n);
int main(void)
{
int XNAME(1) = 14; //变为 int xi = 14;
int XNAME(2) = 20; //变为 int x2= 20;
PRINT_XN(1); //变为printf("x1 = %d\n", x1);
PRINT_XN(2); //变为printf("x2 = %d\n", x2);
return 0;
}
输出如下:
x1 = 14
x2 = 20
参考书籍:C Primer Plus 第五版(Stephen Prata)