07-用宏参数创建字符串_#运算符
16.3.1 用宏参数创建字符串:#运算符
下面是一个类函数宏:
#define PSQR(X) printf("The square of X is %d.\n", ((X)*(X)));
假设这样使用宏:
PSQR(8);
输出为:
The square of X is 64.
注意双引号字符串中的 X 被视为普通文本,而不是一个可被替换的记号。
C允许在字符串中包含宏参数。在类函数宏的替换体中, # 号作为一个预处理运算符,可以把记号转换成字符串。例如,如果 x 是一个宏形参,那么 #x 就是转换为字符串 "x" 的形参名。这个过程称为字符串化(stringizing)。程序清单16.3演示了该过程的用法。
程序清单16.3 subst.c 程序
/* subst.c -- 在字符串中替换 */
#include <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.
调用第1个宏时,用 "y" 替换 #x 。调用第2个宏时,用 "2 + 4" 替换 #x 。ANSI C字符串的串联特性将这些字符串与 printf() 语句的其他字符串组合,生成最终的字符串。例如,第1次调用变成:
printf("The square of " "y" " is %d.\n",((y)*(y)));
然后,字符串串联功能将这3个相邻的字符串组合成一个字符串:
"The square of y is %d.\n"