C语言的#运算符
引言
在类函数宏中(带参数的宏),#号作为一个预处理运算符,可以把记号转换成字符串。
示例分析
下面是一个类函数宏:
#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”的形参名 。这个过程称为字符串化。
示例:
/* subst.c -- substitute in string */
#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.
调用第一个宏时,用“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"
注意,#的这种作用只有在类函数宏的替换体中才能发挥这种作用。
参考资料:
史蒂芬・普拉达. C Primer Plus (第6版) 中文版[M]. 人民邮电出版社, 2016.