浅谈宏函数妙用!

宏函数在项目开发中用的频率非常高,跟普通函数相比,它没有复杂的调用步骤,也不需要给形参分配空间,所以很多场景都需要宏函数的存在。
简单的宏函数确实也挺简单,比如这样的无参宏函数,在代码中凡是出现debug的地方,都会替换成printf这条输出语句。
#define debug printf(helloworld)void main(){    debug;  // 等价于 printf(helloworld);}  复杂一点的,在宏函数中加个参数,我们把它称作有参宏函数,比如这样的:#define debug(s) printf(%s, s)void main(){    debug(helloworld);}调用debug的时候,需要传个参数进去,当然这个参数必须是字符串,如果随便写个数字,运行的时候就是段错误。#define debug(s) printf(%s, s)void main(){    debug(1);    //段错误}  这也把宏函数的缺点暴露了出来,参数没有类型限制,不够安全。 再回到文章刚开始的地方。
这个宏函数不仅有参,而且还是可变参数,在代码中凡是出现debug的地方,都把他替换成fprintf。 唯一不太好懂的地方,可能是args前面出现了两个井号。 两个井号在c语言中被称为连接符号,功能就是在带参的宏函数中将两个字串连接成一个新的字符串。 举个例子,有这样一个宏函数:#define name(x) name_##xvoid main(){ int name_1, name_2;     name(1);        // 等价于 name_1;}  如果调用的时候参数传入1,就被替换成了name_1。 在可变参数中,两个井号就是把所有参数连接在后面。 宏函数的使用场景很多,就拿图上这个来说,可以实现项目开发的时候打开调试信息,方便调试代码。项目完成后关闭调试信息。我们来个测试代码。#include #ifdef debug #define debug(format, args...) fprintf(stderr, format, ##args)#else #define debug(format, args...) #endifint main(){ int a = 1; debug(a = %d, a); return 0;}在主函数中调用debug函数,如果你希望debug函数执行,编译的时候提供debug宏定义就行。gcc test.c -o test -ddebug  如果你不希望信息输出,编译的时候就不要管它。gcc test.c -o test  这个方法比项目完成后,一行一行去删除调试信息来的更方便。 如果你看过一些开源代码,肯定会发现很多宏定义中使用do while语句。#define ns_get16(s, cp) do { const unsigned char *t_cp = (const unsigned char *)(cp); (s) = ((uint16_t)t_cp[0] << 8) | ((uint16_t)t_cp[1]) ; (cp) += ns_int16sz; } while (0)#define ns_get32(l, cp) do { const unsigned char *t_cp = (const unsigned char *)(cp); (l) = ((uint32_t)t_cp[0] << 24) | ((uint32_t)t_cp[1] << 16) | ((uint32_t)t_cp[2] < 0) debug(num); else printf(error); return 0;}  
这个代码编译的时候会提示语法错误,因为宏定义中包含了两条语句,同时判断语句中又没有使用大括号。do while可以解决这个问题。
#include #define debug(num) do {num--; printf(%d, num);} while(0)int main(){ int num = 1; if (num > 0) debug(num); else printf(error); return 0;}  
总结一下,do while可以把复杂的语句包裹起来,使它成为一个单独的单元,避免语法问题。而且大部分的编译器都能识别while(0)这种无效的循环,并且把它优化掉,不会造成效率上的问题。


AMD的RX 5500系列显卡将采用三星7nm制程
三安、华灿等5家芯片企业跻身“2020年度LED产业链TOP50”
显卡工作原理是什么?
AI农业规模巨大的同时存在什么问题
华为畅享9降价 搭载高通骁龙450处理器
浅谈宏函数妙用!
基于开板式ZWG-40DP和ZWG-40COM系列的环境监测RTU
苹果自动驾驶汽车技术将搭载自主研发的突破性电池技术
不想活?VR眼镜,虚拟现实电影体验 “生命最后的时刻会是什么样子?”
霓虹灯的制作教程
英伟达460.79 WHQL驱动发布
华为创新技术协助俄罗斯移动运营商进行了5G网络测试
量子随机数发生器或将是网络安全的未来
热敏电阻器的电阻温度特性测量
什么是压电超声波马达?压电超声波马达如何工作?
智能时代下未来医疗还能实现多少想象
Wi-Fi 6® 鲜为人知的功能如何帮助您放心连接物联网设备
潜力巨大!BLDC电机控制器市场有望快速增长
研究人员们提出了一系列新的点云处理模块
途歌资金链断裂退押难 共享汽车难熬寒冬?