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