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语言
    +关注

    关注

    180

    文章

    7606

    浏览量

    137064
  • uart
    +关注

    关注

    22

    文章

    1239

    浏览量

    101469
  • 字符串
    +关注

    关注

    1

    文章

    579

    浏览量

    20549
收藏 人收藏

    评论

    相关推荐

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

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

    光纤外面的皮破了一点有关系吗

    光纤外面的皮破了一点,在般情况下,只要光纤的纤芯没有受到损伤,对通信通常是没有影响的。光纤的外皮主要起保护作用,能够防止光纤受到机械损伤、腐蚀、潮湿等外部环境的损害。如果外皮破损,但纤芯仍然保持
    的头像 发表于 11-25 10:04 423次阅读

    让单片机代码性能起飞的七大技巧

    单片机的程序比软开少些,真正想编写出高效的代码,还是要积累很多年的。           在做研发工程师的10年里,我经历过几个公司,看过很多工程师写的代码,但真正能让我跪着看完的,
    的头像 发表于 11-16 10:21 601次阅读
    让单片机<b class='flag-5'>代码</b>性能起飞的七大技巧

    如何写出稳定的单片机代码

    这篇文章分享怎么写出稳定的单片机代码。     我对优秀代码的理解,大体分为两个部分:高效和稳定。   两者都能做到很好的,如果靠自己摸索,没有刻意去练习,可能需要花10年,甚至更久
    的头像 发表于 11-15 16:40 425次阅读
    如何<b class='flag-5'>写出</b>稳定的单片机<b class='flag-5'>代码</b>

    TPA3255音量稍微大一点就会保护,需要重新启动,怎么解决?

    经过反复测3255 双声道模式2欧喇叭单元,音量稍微大一点就会保护,需要重新启动,4欧以上就没有任何问题,这个情况供电超过36V 才明显,尤其高压50V左右,只要音量有一点就保护了。单声道模式可以55V供电不保护。寻求解决办法,调整电阻,电容,或者加粗铜箔走线,并没有得
    发表于 09-30 08:32

    大功率贴片电感的电感值偏大一点可以用吗

    电子发烧友网站提供《大功率贴片电感的电感值偏大一点可以用吗.docx》资料免费下载
    发表于 09-20 11:33 0次下载

    OPA2228在分压之后的一点信号就出现了失真,为什么?

    我使用OPA2228双运放,其中个运放做THS5651的输出I-V转换,将该电压信号经过电阻分压衰减送进另个运放组成的射极跟随器,但是测到在进入分压前没有问题,但是在分压之后的一点信号就出现了失真,请问是什么原因,如何解决
    发表于 09-20 08:03

    电感碎了一点点能正常用吗

    电子发烧友网站提供《电感碎了一点点能正常用吗.docx》资料免费下载
    发表于 09-04 11:32 0次下载

    发电机转子一点接地如何处理

    故障原因分析 发电机转子一点接地故障的原因主要有以下几种: 1.1 机械损伤 发电机转子在运行过程中,由于振动、摩擦等原因,可能导致转子绕组的绝缘层受到损伤,从而引发接地故障。 1.2 绝缘老化
    的头像 发表于 08-20 17:05 1619次阅读

    BLDC桥驱动的两端都会并联很大的电容和个小一点的电容,这个电容是必须的吗?

    官方出的关于bldc电机控制的开发板,桥驱动的两端都会并联很大的电容和个小一点的电容,这个电容是必须的吗? 是否可以去掉? 希望得到回复,谢谢!
    发表于 07-04 07:15

    ESP32C3烧录fast_scan的例程代码,怎么一点东西都没有显示的?

    最近研究ESP32C3的WIFI 部分,烧录fast_scan的例程代码,怎么一点东西都没有显示的?只是显示了ESP32的MAC地址?什么东西都没有显示或者动作了?我是不是要在menuconfig设置某些东西才能扫描AP?还是要在程序里面设置?望指点?
    发表于 06-17 06:08

    请问ARM Cortex系列烧写器哪个烧写快一点

    最近个工程文件有点大,用STLink烧写需要40多秒,CMSIS-CAP烧写需要30秒左右,jlink没试过,我还知道用带USB的Bootloader进行flash烧写的,但不知道哪个烧写快一点,请问大家都在使用什么烧写器呢?
    发表于 05-10 06:15

    使用stm32cubeprogrammer下程序总闪退,一点\"start programm\" 就退出怎么解决?

    使用stm32cubeprogrammer 下程序总闪退,连接是正常的,一点\"start programm\" 就退出。
    发表于 03-28 08:25

    如何写出时序最优的HDL代码?如何写出时序裕量足够的代码

    你想写出可以跑出700M以上的代码吗,直逼FPGA内部PLL的极限。
    的头像 发表于 03-12 09:59 930次阅读
    如何<b class='flag-5'>写出</b>时序最优的HDL<b class='flag-5'>代码</b>?如何<b class='flag-5'>写出</b>时序裕量足够的<b class='flag-5'>代码</b>?

    将使用的色环插件电感换成更大一点会影响使用吗

    将使用的色环插件电感换成更大一点会影响使用吗 编辑:谷景电子 关于色环插件电感替换的问题之前有过对应的讨论,看到有人留言问:将当前使用的色环插件电感方案换成比原来大的电感会影响使用吗?今天我们就来
    的头像 发表于 01-23 11:30 634次阅读