[C语言]2021/11/16 C预处理器和C库-#define

本文深入探讨了C语言中的宏定义,包括#define如何工作,双引号的作用,以及预处理运算符#和##的功能。通过示例展示了如何使用这些运算符在字符串中插入宏参数,并解释了预处理粘合剂##如何连接宏。此外,还介绍了可变参数宏__VA_ARGS__的使用,并提供了注意事项,如宏定义的命名规范和性能优化建议。
摘要由CSDN通过智能技术生成

        #define的形式,其实应该以#+define来理解,#的符号含义时替换,而define的意义是定义,其实按照语言的语法来理解很清晰,定义一个东西用来替换另一个东西。

        双引号的作用有一点和#的意思相反的意思,再printf函数中如果使用了“”则再“”中的字符串会被视为普通文本,而不是一个可被替换的符号。例如:

#define TEST01(x)    printf("Hello x is %d.\n",((x)*(x));
TEST(2);

输出为:Hello x is 4.

C语言允许在字符串中包含宏参数,而在类函数宏中,#作为一个预处理运算符,可以将记号转变为字符串。

#define TEST02(x)    printf("Hello #x is %d.\n",((x)*(x));
TEST02(2);
TEST02(2+4);
输出结果:
        Hello 2 is 4;
        Hello 2+4 is 36;

 在这里,#号就是将2+4文本替换到了x的位置,预处理器不会进行运算,所以它不会输出为6 is 36.

        预处理粘合剂:##运算符,这个符号会将宏替换体中的两个记号粘合在一起,例如:

#define TEST03(n)    x##n;
#define PRINT_TEST03    printf("x"#n"= %d\n",x##n);

int main()
{
int TEST03(1) = 14;    //int x1 = 14
PRINT)TEST03(1);       //prinft("x1 = %d\n",x1)
}


输出结果为:x1 =14

· 实现宏定义的可变参数 头文件:stdvar.h

顾名思义,函数接受数量可变的参数。

其格式为:

#define TEST04(...)    printf(__VA__ARGS__)

 将红参数列表中最后的参数写成省略号(...),并将__VA__ARGS__可用在替换部分中,表明省略号代表的东西。

#define TEST04(...)    printf(__VA__ARGS__)

TEST04(“Howdy”);
TEST04(“weight = %d,shipping = $%.2f\n”,wt,sp);
即展开后的代码:
printf("Howdy");
printf(“weight = %d,shipping = $%.2f\n”,wt,sp);

在使用宏时需要注意的事项:

1.宏名中不可以出现空格,但在替换字符串中可以有空格。

2.用圆括号把宏的参数和整个替换体括起来,这样能确保被括起来的部分在下面这样的表达式中可以正确的展开:

forks = 2 * MAX(guests + 3,last);

2.用大写字母表示宏函数的名称。该惯例不如用大写字母白哦是宏常量应用广泛。但是大写字母可以提醒程序员注意,宏可能产生的副作用。

3.如果打算使用宏来加快程序的运行速度,那么首先要确定使用宏和使用函数书否会倒是较大差异。在程序中值使用一次的宏无法明显减少程序的运行时间,在桥套循环中使用宏更有助于提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值