在我们写程序的时候,总是需要使用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
这就是打印出来的结果,文件名,行数,内容