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

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

1、简单宏定义

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

调试—宏定义开关控制printf打印输出_第1张图片

这样就能在控制台看到两条打印
在这里插入图片描述
当我们把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

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

你可能感兴趣的:(零散知识,嵌入式,stm32,单片机,c语言)