宏使用方法_典型案例分析

宏使用方法_典型案例分析宏使用案例说明_使用宏的案例

说明

前几天改一份老代码用,一份错误为了纠错而纠错将代码写的很长的代码,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)

今天的文章宏使用方法_典型案例分析分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62115.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注