硬汉嵌入式论坛

 找回密码
 立即注册
查看: 515|回复: 5
收起左侧

[技术讨论] 分享自用的简单日志

[复制链接]

6

主题

17

回帖

35

积分

新手上路

积分
35
发表于 2025-5-13 10:55:22 | 显示全部楼层 |阅读模式
没有什么复杂的操作,用于串口或者RTT 打日志;


[C] 纯文本查看 复制代码
#if (LOG_LEVEL == 0)

	#define log_info(fmt, args...)							\
		do {												\
			printf("%s %d: [info] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)		

	#define log_dbg(fmt, args...)
	#define log_err(fmt, args...)

#elif (LOG_LEVEL == 1)

	#define log_info(fmt, args...)							\
		do {												\
			printf("%s %d: [info] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)

	#define log_dbg(fmt, args...)							\
		do {												\
			printf("%s %d: [dbg ] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)

	#define log_err(fmt, args...)

#elif (LOG_LEVEL == 2)

	#define log_info(fmt, args...)							\
		do {												\
			printf("%s %d: [info] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)

	#define log_dbg(fmt, args...)							\
		do {												\
			printf("%s %d: [dbg ] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)

	#define log_err(fmt, args...)							\
		do {												\
			printf("%s %d: [err ] ", __func__, __LINE);		\
			printf(fmt, ##args);							\
		} while(0)
#else

	#define log_info(fmt, args...)
	#define log_dbg(fmt, args...)
	#define log_err(fmt, args...)

#endif

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
发表于 2025-5-15 07:15:01 | 显示全部楼层
谢谢分享
回复

使用道具 举报

4

主题

45

回帖

57

积分

初级会员

积分
57
发表于 2025-5-15 11:37:51 | 显示全部楼层
我看到别人的代码也和你一样用do while(0) 这种方式去写,原因是啥呢?为什么不直接{}呢?有知道这样写原因 的小伙伴么?
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-5-15 14:59:11 | 显示全部楼层
平哥 发表于 2025-5-15 11:37
我看到别人的代码也和你一样用do while(0) 这种方式去写,原因是啥呢?为什么不直接{}呢?有知道这样写原因 的 ...

怎么用都可以,能实现功能就可以。 只是这样用能够减少一些宏展开引来的意想不到的问题,代码模块性可读性维护性更好点。另外就是这样写能在宏函数中实现更复杂的逻辑。函数调用也能保持和一般函数调用方式一致,简单例子 func(); 如果只是大括号,宏替换 {};花括号后加;?
回复

使用道具 举报

24

主题

192

回帖

264

积分

高级会员

积分
264
QQ
发表于 2025-5-15 15:04:04 | 显示全部楼层
平哥 发表于 2025-5-15 11:37
我看到别人的代码也和你一样用do while(0) 这种方式去写,原因是啥呢?为什么不直接{}呢?有知道这样写原因 的 ...

宏函数的手段,相比{}避免额外的符号语义。

比如楼主的 log_info,while(0)
保证调用的时候必须尾部增加’;‘
也就是类似 log_info(xxx,xxx); 这样的方式使用
不会有人丧心病狂  log_info(xxx,xxx);;

如果是{},尾部就不准增加’;‘,但是看起来又像一个函数,有时顺手就会使用 log_info(xxx,xxx);
在组合语句中会 { }; 引起错误
回复

使用道具 举报

4

主题

45

回帖

57

积分

初级会员

积分
57
发表于 2025-5-15 15:59:20 | 显示全部楼层
4楼 5楼 解释的有道理! 谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-1 18:29 , Processed in 0.246658 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表