当前位置:嗨网首页>书籍在线阅读

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"