可变参数宏的原理及作用

本文介绍了可变参数宏在软件调试中的重要性,如何通过宏控制调试信息,并探讨了两种常见的DEBUG_PRINT宏实现方式。利用__VA_ARGS__、do {...}while(0)以及##连接符的原理,确保宏展开后的正确性和兼容性。同时,通过DEBUG宏开关,可以在编译时轻松控制打印信息的显示与隐藏,避免大量打印对正式发布的影响。

有什么作用呢?


主要是为了方便管理软件中的打印信息。我们在写代码或者修改bug时通常会将一些重要参数打印出来,方便我们debug,但是软件发行的时候通常我们不希望有这些打印,可变参数宏就可以在这里大显身手,当然也可以用分级控制(ERR、INFO/ WARNING  DEBUG)的方式来管理,实现起来也不麻烦,只要在这个宏中添加判断语句就可以。

但是一般我们调试问题,不会把所有打印都打开,因为工程具有一定规模的时候,打印非常多;通常我们只打开某个文件或者模块的打印,这时可以再对应模块中添加变了或者宏来控制打印。


常用的有2种方式:

#define DEBUG_PRINT(fmt,args...) do{printf(fmt"\r", ##args);}while(0)

#define DEBUG_PRINT(fmt, ...) do {printf(fmt"\r",  ##__VA_ARGS__);}while(0)

效果一样的, 下面就来分析一下这个原理:


1. 首先我们需要知道,可变参数宏是在C99标准中才实现的,以前没定义这个 __VA_ARGS__宏,这个宏就代表可变参数列表,在GCC中  也支持args...这种写法。  

2. 关于do {...}while(0) 的用处多多,其中一个就是防止宏展开后,代码出问题。

例如, if(true) PRINTF   如果这时printf中含有2两以上代码,那么就会导致只能执行第一条。

3. ##  这个符号在宏定义中的作用是连接字符串,会忽略前后的空格, 如  A ## B   宏展开后为  AB。 这里加##字符串式为了解决在__VA_ARGS__为空时,后面多出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值