0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至配饺子 来源:最后一个bug 作者:bug菌 2022-08-11 17:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

#和##对于大部分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菌这里仅展示了一个拼接变量,当然多个也是同样没有问题的,跟我们函数传递参数一样,不过这样也会增加整个替换的复杂度,合理利用即可~


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144632
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106123
  • 字符串
    +关注

    关注

    1

    文章

    594

    浏览量

    23044
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    法拉电容一点电没有还能用吗为什么

    法拉电容即使完全没电仍可恢复使用,因其储能机制为物理双电层理论,可逆性强,无需化学反应,长期闲置后仍能恢复功能。
    的头像 发表于 11-12 09:26 419次阅读
    法拉电容<b class='flag-5'>一点</b>电没有还能用吗为什么

    代码格式化工具Clang-Format提升你的CW32工程质量

    它能自动统团队代码风格,让不同开发者写出代码如出辙。就像 CW32 官方库函数遵循统规范
    的头像 发表于 10-09 17:43 910次阅读
    <b class='flag-5'>代码</b>格式化工具Clang-Format提升你的CW32工程质量

    为什么变压器的铁芯要接地,而且只能一点接地?

    变压器作为电力系统中不可或缺的关键设备,其安全稳定运行对整个电网至关重要。在变压器设计中,铁芯接地是个看似简单却蕴含深刻原理的技术细节。为什么铁芯必须接地?又为何只能采用一点接地的方式?这需要
    的头像 发表于 09-03 07:35 1796次阅读

    0.04% vs 0.1%:精度差一点,逆变器性能差距有多大?

    本文导读台光伏逆变器损失的功率可能仅仅源于0.3%的MPPT效率差距。这个足以影响产品竞争力的数字,可能并非算法优劣,而在于测试源头的精度选择:是0.04%还是0.1%?本文通过四大测试场景的量化
    的头像 发表于 08-20 11:32 1399次阅读
    0.04% vs 0.1%:精度差<b class='flag-5'>一点</b>,逆变器性能差距有多大?

    请问如何使用ICP编程工具写出序列号?

    如何使用ICP编程工具写出序列号?
    发表于 08-19 07:01

    【经验分享】玩转FPGA串口通信:从“幻觉调试”到代码解析

    FPGA开发,思路先行!玩FPGA板子,读代码是基本功!尤其对从C语言转战FPGA的“宝贝们”来说,适应流水线(pipeline)编程可能需要点时间。上篇点灯代码解读了基础,而如果能亲手写出串口通讯
    的头像 发表于 06-05 08:05 886次阅读
    【经验分享】玩转FPGA串口通信:从“幻觉调试”到<b class='flag-5'>代码</b>解析

    CW32模块使用 MAX7219四合一点阵模块

    四合一点阵显示模块采用MAX7219作为控制,它是种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括
    的头像 发表于 05-12 16:04 701次阅读
    CW32模块使用 MAX7219四合<b class='flag-5'>一点</b>阵模块

    SlaveFifo 2bit sync模式下最大速度只有320Mbyte/s左右,还能更快一点吗?

    也只有320Mbyte/s左右,还能更快一点吗?怎么优化。希望超过400MB/s。我只需要个读,个写线程即可。其他线程资源可以关闭掉该如何关闭。 是不是定要采用GPIF II那种
    发表于 05-06 14:36

    开关电源的一点总结

    关于开关电源,其实没有什么好写的,或者说,已经有很多专门写开关电源的书,三言两语也说不出什么来。但是以前有人问过我些问题,现在想起来,总结下。 1,开关电源的占空比 初学者总是不明白占空比跟输入
    发表于 04-03 13:50

    ads1298在LA和RA接同一点时,为什么输出是7fffff,差分输出的话不是应该是0吗?

    我的电路与ti给的样,LA连接IN2P,LL连接IN3P,RA连接IN2N,IN3N.然后我配置的2通道6倍输出。请问在我LA和RA接同一点时,为什么输出是7fffff,差分输出的话不是应该是0吗?
    发表于 02-11 06:17

    12位串行AD好用一点的有哪些介绍的?

    12位串行AD好用一点的有哪些介绍的
    发表于 02-06 07:05

    用LMP91200采集PH信号,LMP91200输出的电压会一点一点下降,是什么原因导致的?

    我用LMP91200采集PH信号。在前段信号无变化的情况下,LMP91200输出的电压会一点一点下降。电路连接我是参考LMP91200开发板的。 请问可能是什么原因?需要采取什么措施解决?
    发表于 02-05 06:12

    这是对1115的配置,为什么实际当中只能采到0.6多一点的电压再大就不行了?

    ] =0x54; // 配置字高字节,采用-2.048到+2.048,选择AINp1输入,AINPn为GND Init_Data[3] =0x83; // 配置字低字节,选择转换速率即通信速率 这是对1115的配置为什么实际当中只能采到0.6多一点的电压 再大就不行了
    发表于 01-20 08:43

    吴晓波年终解读联想AI PC

    智能的浪潮滚滚向前,人们站在历史与未来的交汇,急切寻找能够穿越新周期的船。日前,“预见2025·吴晓波年终”在厦门举办,吸引了线上线下超千万人观看。财经作家、巴九灵创始人吴晓波在年终下半场
    的头像 发表于 01-02 11:55 783次阅读

    救助,定义个大一点的数组导致编译不通过问题。

    本例使用 CSU-IDE V6.0.6 ,单片机为CSU38F20,发现在改大数组的时候编译不通过,请各位大神指教。具体问题描述如下: 正常情况: 串口收发缓冲区定义小一点没有问题,如下
    发表于 01-01 15:43