C语言在#define中使用#运算符和##运算符

下面是一个类函数宏:

#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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值