对调试信息函数的宏封装实用小技巧分享

在轻量型嵌入式开发中,没有单独的日志信息库,所以通常需要开发者自己对调试打印信息进行封装,这样即方便调试,也方便后续查问题,可以用一个宏开关对齐全局控制。

首先可以根据宏定义定义不同需要打印的函数,此处仅做一个简单示例

#if 1
#define KERNEL_DEBUG_LOG(fmt,...)
#define KERNEL_DEBUG_LOG(fmt,...)
#else
#define KERNEL_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[KERNEL]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)
#define DRIVER_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[DRIVER]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)
#endif

另外就是在打印信息中,我们想要加入其他打印的信息,比如行号,函数名等等,但是又不想每写一句调试信息就写一边,就可以通过下面的方式,利用宏的可变参数实现。

注:笔者此处封装函数为:void log_direct(unsigned int info, const char *fmt, ...);

如果为printf的原型:int log_direct( const char *fmt, ...); 对宏定义中微调即可。

#define DRIVER_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[DRIVER]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)

如果有需求,还可以在宏中定义一个输出等级,do{}while(0)中判断一下输出等级再决定是否输出调试信息。当然如果打印信息比较多,这样写编译出的code字段会占很大的空间。

如代码段一,用宏去简单粗暴的定义,定义后编译后显示的占的空间很小,会直接被优化掉。

另外其他宏及可变参数的相关的知识就不再赘述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值