简单易懂的宏使用说明案例

说明

前几天改一份老代码用,一份错误为了纠错而纠错将代码写的很长的代码,150多行,实际操作只有70行。一篇代码,屏幕都看不到一对{},所以在这里给跟我原来一样的人,讲讲宏,能帮你让代码可读性更好,更便于维护。

先上代码和结果

代码

 18 #include<stdio.h>
 19 #include<string.h>
 20 #define TO char type;/*注释必须用斜杠+星+注释内容+星+斜杠*/\
 21             char* ptype=&type;/*拼接符'\'必须在最后,且前面不能有'\\'*/\
 22             struct test the_test;the_test.abc=2;/*可以一行写多个执行语句*/\
 23             struct test*ptest=&the_test;//这里就可以使用双斜杠了'//',因为后面没有拼接符[39]
 24 #define TOA(type) printf("%d\n",*type);//运算符不用拼接[42]
 25 #define TOB(p) printf("%d\n",*p##type);//非运算符需要拼接[43]
 26 #define TOC(type) printf("%d\n",type->abc);//也是运算符不用拼接[44]
 27 #define TOD(type) printf("%d\n",type##bc);//拼接优先级大于运算符优先级,展开为type->abc,先拼接,后运算[45]
 28 #define TOE(type) printf("%d\n",type abc);//运算符不用拼接,但是连打无法识别,所以用空格隔开type展开为type->[46]
 29 #define TOF(type) printf("%s\n",#type);//转换为字符串[47]
 30 //宏只做替换,实际不做运算,不会帮你加括号,下面就是对比
 31 #define TOG(a,b) a+b//不加括号,展开后会根据+优先级来判断是否先a+b[48]
 32 #define TOH(a,b) (a+b)//加了括号,展开后会根据()的高优先级先运算a+b,得到其和再去运算[49]
 33 struct test
 34 {
 35     char abc;
 36 };
 37 int main()
 38 {
 39     TO//[20]<-这表示宏定义时的行号或则被使用的代码行号
 40     type=1;//宏定义的变量使用
 41     printf("%d\n",type);//对宏定义的变量的使用的测试打印
 42     TOA(ptype)//测试运算符是否需要拼接的请看这个宏[24]
 43     TOB(p)//测试非运算符是否需要拼接的请看这个宏[25]
 44     TOC(ptest)//不确定是否所有运算符都不用拼接的请看这个宏,前面测试单目,这里双目,还是不信,自己去测三目[26]
 45     TOD(ptest->a)//测试运算符拼接的请看这个宏[27]
 46     TOE(ptest->)//测试如果输入末尾是运算符,该怎么书写的看这个宏[28]
 47     TOF(ptest->abc)//测试将输入变为字符串的请看这个宏[29]
 48     printf("5*TOG=%d\n",5*TOG(ptest->abc,type));//测试宏是否先运算的看这里[31]
 49     printf("5*TOG=%d\n",5*TOH(ptest->abc,type));//测试宏只做替换的看这里,与上面的对比[32]
 50     return 0;
 51 }
 52 

结果

在这里插入图片描述

再来说明

格式为:宏+展开前+代码+展开后

TO

因为拼接符并不是宏操作独有,所以就不说明了

TOA(type)

展开前:

TOA(type) printf("%d\n",*type);//运算符不用拼接[42]

代码:

TOA(ptype)//测试运算符是否需要拼接的请看这个宏[24]

展开后

printf("%d\n",*ptype);

TOB(p)

展开前:

TOB(p) printf("%d\n",*p##type);//非运算符需要拼接[43]

代码:

TOB(p)//测试非运算符是否需要拼接的请看这个宏[25]

展开后

printf("%d\n",*ptype);

TOC(type)

展开前:

TOC(type) printf("%d\n",type->abc);//也是运算符不用拼接[44]

代码:

TOC(ptest)//不确定是否所有运算符都不用拼接的请看这个宏,前面测试单目,这里双目,还是不信,自己去测三目[26]

展开后

printf("%d\n",ptest->abc);

TOD(type)

展开前:

TOD(type) printf("%d\n",type##bc);//拼接优先级大于运算符优先级,展开为type->abc,先拼接,后运算[45]

代码:

TOD(ptest->a)//测试运算符拼接的请看这个宏[27]

展开后

printf("%d\n",ptest->abc);

TOE(type)

展开前:

TOE(type) printf("%d\n",type abc);//运算符不用拼接,但是连打无法识别,所以用空格隔开type展开为type->[46]

代码:

TOE(ptest->)//测试如果输入末尾是运算符,该怎么书写的看这个宏[28]

展开后

printf("%d\n",ptest->abc);

TOF(type)

展开前:

TOF(type) printf("%s\n",#type);//转换为字符串[47]

代码:

TOF(ptest->abc)//测试将输入变为字符串的请看这个宏[29]

展开后

printf("%d\n","ptest->abc");

TOG(a,b)

展开前:

TOG(a,b) a+b//不加括号,展开后会根据+优先级来判断是否先a+b[48]

代码:

printf("5*TOG=%d\n",5*TOG(ptest->abc,type));//测试宏是否先运算的看这里[31]

展开后

printf("5*TOG=%d\n",5*ptest->abc+type));//5*2+1=11

TOH(a,b)

展开前:

TOH(a,b) (a+b)//加了括号,展开后会根据()的高优先级先运算a+b,得到其和再去运算[49]

代码:

printf("5*TOG=%d\n",5*TOH(ptest->abc,type));//测试宏只做替换的看这里,与上面的对比[32]

展开后

printf("5*TOG=%d\n",5*(ptest->abc+type));//5*(2+1)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值