全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

#和##写出“秀”一点的代码

时间:2022-08-11 17:44

人气:

作者:admin

标签: 字符串  uart  C语言 

导读:从结果上看来似乎#仅仅只是代替了字符串的双引号,而##却实现了标识符的拼接,这样就为编码标识符的处理上能够带来更多的可玩性。...

#和##对于大部分C语言玩得还算比较溜的朋友并不是很陌生,不过能把这两个知识点游刃有余的应用到所在代码中的每个角落,似乎并没有几个人能够做到,学的时候朗朗上口,而编码的时候却抛之脑后。

但是今天还是想重新介绍这两个“兄弟”,希望大家能够写出"秀"一点的代码~

1、#和##基础

对于这两个语法的功能都比较简单,且都是在

预处理阶段

做一些工作 :

#主要是将宏参数转化为字符串

##主要是将两个标识符拼接成一个标识符

没点代码似乎并不是那么形象 :

参考demo:

pYYBAGL0zluACYjNAADPq4hIo50851.png

输出结果:

poYBAGL0zm2AVtyJAAAmcrg7hqI889.png

从结果上看来似乎#仅仅只是代替了字符串的双引号,而##却实现了标识符的拼接,这样就为编码标识符的处理上能够带来更多的可玩性。那么,下面bug菌跟大家具体展示一下他们的常用技巧:

2、#的玩法

1、标识符的“字符串变量"

“#”一般结合打印语句组合成一个宏定义,可以方便的打印相关信息,下面给个简单的实例就明白了。

poYBAGL0zoGADIkhAADSeljeKRQ791.png

输出结果:

poYBAGL0zpiAFJ5ZAAAtJvQj9fg944.png

这样的话就不需要总是采用双引号来单独书写,同时你还可以继续扩展构造更加灵活的宏。2、结合##进行字符串拼接打印前面介绍了##进行标识符的拼接,那么实现拼接标识符转化为字符串看来很简单吧,于是你会编写了如下代码:

poYBAGL0zqqAfcaQAACGvTONuOs330.png

暗自欢喜的编译着,然而却得到了如下结果:

poYBAGL0zrqAYk3ZAAAWu9H8nAY063.png

得到的并不是拼接以后你想要的uart1,难道不能这么玩?当然不是,不然也不会在这里拿出来说 。首先要知道原因 : 进行宏定义嵌套的情况,#或者##仅在当前宏有效,嵌套宏中不会再次展开,既然当前宏无法展开,那么我只能再加一级宏定义作为转换宏进行展开,看能不能解决该问题:

poYBAGL0zsuAKj0PAACb6YBeaEw850.png

此时输出的结果符合我们的预期:

poYBAGL0ztyAORLuAAAamuC2BLc556.png

首先进行第一层转换宏替换处理掉##拼接符得到str(uart1),然后进行字符串转换符的处理为uart1字符串打印输出,当然以后你会遇到一些复杂的,不过要诀就是宏替换只会处理当前的#或者##,否则就需要增加转换宏提前进行宏替换展开。所以采用##拼接出来的标识符想要打印输出的话,使用#进行转换是最直接、方便的。

3、##的玩法

##拼接符的玩法有点多,甚至有些还比较绕,当然如果你游刃有余的话,这对于重构代码是一把“ 利器 ”。

1、在结构体定义中的妙用

下面是bug菌经常在项目代码中用到的##结构体定义法,也是非常多开源代码中惯用的做法,相比常规的结构体定义法,确实省去很多重复的代码。比如下面的参考代码 :

poYBAGL0zvKAQ-U1AADbGFWhUxI580.png

2、统一宏替换

拼接标识符意味着符号的粒度更高,而这碎片化的符号进行有效的管理,就可以使得符号更加具有通用性和灵活性。其实这种思想跟我们代码模块话是同样的道理。来首先我们用一个两层拼接体验一下:

pYYBAGL0zxWAdqXPAAHsk2LPMp4853.png

poYBAGL0zxuAed17AAALIYngyf0601.png

编写的思路bug菌在代码中跟大家都标注了,相信大家一眼就能看懂,似乎并没有想象中那么难。而在前面介绍##的基础知识提过,只要转换宏写得够多,你可以一层套一层,最终获得你想要的标识符,达到修改一个简单的宏即可替换一整套宏的效果。所以关键还是你要清晰的把拼接变量找出来,bug菌这里仅展示了一个拼接变量,当然多个也是同样没有问题的,跟我们函数传递参数一样,不过这样也会增加整个替换的复杂度,合理利用即可~


审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信