调试—宏定义开关控制printf打印输出

在我们写程序的时候,总是需要使用printf输出来进行程序调试。
当我们的程序很大的时候,如果很多的打印信息,那么系统跑起来就会很卡。所以,就学习到了一个小技巧,在需要的调试的时候在开启打印log,不需要的时候就不开启。

1、简单宏定义

#if 1
#define	DEBUG	printf
#endif
#define DEBUG(...)

在这里插入图片描述

这样就能在控制台看到两条打印
在这里插入图片描述
当我们把DEBUG关闭的时候就看不到打印了

#if 0
#define	DEBUG	printf
#endif
#define DEBUG(...)

在这里插入图片描述

2、详细的宏定义
希望DEBUG能够像printf那样,支持多个参数,并且这些参数刚好展开成为printf语句本身使用的参数。
如果我们的程序很大,我们并不能一下子知道这条信息到底是在那里打印出来的,所以需要把当前所在文件名和源码行位置也打印出来,这样就一目了然,不需要去工程源码中慢慢查找。

知识补充:
编译器内置宏:

编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

ANSI C标准中有几个标准预定义宏(也是常用的):

 __LINE__:在源代码中插入当前源代码行号;
 __FILE__:在源文件中插入当前源文件名;
 __DATE__:在源文件中插入当前的编译日期
 __TIME__:在源文件中插入当前编译时间;
 __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。

编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

所以最终版的就是下面这样子

if 1
DEBUG(format,...) printf("FILE: "__FILE__", LINE: %d: "format"/n", __LINE__, ##__VA_ARGS__)
#endif

这就是打印出来的结果,文件名,行数,内容
在这里插入图片描述

printf宏定义是一种在嵌入式系统中为了方便调试添加调试信息的方法。它允许我们根据需要快速打开或屏蔽调试信息,而不影响串口的正常通讯。在C语言中,我们可以使用宏定义来实现printf宏的定义。具体方法如下: ```c #define printf_debug(format, ...) printf (format, ##__VA_ARGS__) ``` 这里的`printf_debug`就是我们定义的宏名称,`format`是一个参数,表示要输出的格式字符串,`__VA_ARGS__`表示可变参数的占位符。这样我们就可以在代码中使用`printf_debug`来输出调试信息。当宏开关被打开时,调试信息会被输出;当宏开关被关闭时,调试信息不会被输出。 例如,我们可以使用以下方式来使用printf宏定义: ```c #ifdef ROBOT_DEBUG #define printf_debug(format, ...) printf (format, ##__VA_ARGS__) #else #define printf_debug(format, ...) #endif ``` 在这个例子中,当ROBOT_DEBUG宏被定义时,printf_debug会被展开为printf语句;当ROBOT_DEBUG宏未定义时,printf_debug会被展开为空语句。 这样,我们就可以在需要调试的地方使用`printf_debug`来输出调试信息。例如: ```c int main() { int a = 0; printf_debug("a = %d",a); printf_debug("test"); return 0; } ``` 以上代码中,当ROBOT_DEBUG宏被定义时,会输出以下结果: ``` [FILE = debug.c][FUNCTION = main][LINE = 15] [a = 0] [FILE = debug.c][FUNCTION = main][LINE = 16] [test] ``` 这样,我们就可以方便地控制调试信息的输出,便于调试和排查问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [printf宏定义](https://blog.csdn.net/gyb510/article/details/72883834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [使用printf进行宏定义](https://blog.csdn.net/baidu_39594043/article/details/120697473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C/C++宏定义的可变参数详细解析](https://download.csdn.net/download/weixin_38635449/14914568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶舞澎湃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值