宏函数是一种特殊的函数宏,与普通函数宏不同的是,它可以拥有多条语句和局部变量,从而实现更复杂的功能。它的定义类似于普通函数,但用大括号包裹起来,并以分号结束每个语句。
#define test(a, b)
({ int temp = a; a = b; b = temp; }) 好奇的读者就会有这样的疑问,为什么要这样写呢,去掉个小括号不行吗,去掉大括号不行吗,只留下小括号不行吗,只留下大括号不行吗?这篇文章就来探讨一下为什么这样写。
| 测试一
直接就去掉上边的两个括号,借助gcc把宏函数展开,通过展开后的代码进行分析:
#include stdio.h#define int_test1(a, b) int tmp = a; a = b; b = tmp;int main(){ int a = 10; int b = 20; // test1 int_test1(a, b); printf(a:%d, a); printf(b:%d, b);} 通过 gcc -e -p 1.c>2.c 命令,把1.c源码文件展开复制到2.c文件中,就可以通过2.c文件找到对应展开的宏函数代码:
可以看到展开后的宏函数在源码中的表现,如果在if或者while等语句不加大括号时,代码执行的效果和预期的不同,不了解过程的就会不好排查问题。
| 测试二
只加小括号会不会能解决问题呢,其实这个语法是不行的,代码会直接报错的:
| 测试三
只加小括号会报错,那只加大括号会不会也报错呢,事实上只加大括号是不会报错的:
是不是解决了if或者while等语句不加大括号时导致出现异常情况,但是这样的写法也带来了新的问题,那就是if语句或者其他语句有分支并且没有带大括号会出现问题:
| 测试四
既加小括号又加大括号会不会是个完美的解决方法呢,通过实测是能通过编译的:
| 测试五
除了测试四的写法,那有没有其他写法呢,答案肯定是必然的:
这个写法是不是更加优美简洁呢,这样的写法应该是很常见的,只是过去没怎么去深究为什么要这样写。
| 测试六
宏函数可以直接对结构体进行初始化,就可以很方便的在定义结构体的时候直接对它进行初始化:
除了上边这样的写法,还可以是这样的写法:
关于宏函数就简单回顾一下,不知道有没有触发到各位的知识盲区呢?
索尼PTZ自动追踪和实时裁切功能都有了哪些革新?
“全面”进入量子时代?
2019年AR/VR头显出货量继续保持强劲的增长 复合年增长率将达66.7%
自发电无线门铃实用易安装且不贵
焊接机器人示教操作流程
C语言中宏函数的定义和用法
电力无人机巡检中的 RTK 技术是怎样的
IEEE 802.3af / at / bt电源配置阶段,IEE 802.3bt PD应用程序框图
美国修改美国企业与华为来往禁令,有助于提升手机市场的渗透率
弘扬航天精神,铸造航天品质!卓兴半导体致敬中国航天人
高通欲收购NXP 交易价格分歧缩减到10%以内
Arduino固定雷达LIDAR阵列的制作
单片机解密为什么是撬开芯片国产化的第一步呢
推动个人局域网和广域网技术的解决方案
3G电子书能否改变阅读习惯?
变电站常见组件的功能和工作原理
2013 款奥迪 Q5 车驾驶人侧电动座椅无法调节
电池修复仪器
开关电源芯片的短路功耗如何计算
一位IT工程师北漂四年的感悟