方式1(繁琐)
#define _DEBUG
#ifdef _DEBUG
printf("第一条调试信息");
#endif
#ifdef _DEBUG
printf("第二条调试信息");
#endif
#ifdef _DEBUG
printf("第三条调试信息");
#endif
每一条调试语句都需要使用两条宏定义来包围,这不但在代码的编写上不便,源码结构也不好看,工作量依然不小。
方式2(无法变参输出)
#define _DEBUG
#ifdef _DEBUG
#define DEBUG(info) printf(info)
#else
#define DEBUG(info)
#endif
DEBUG("第一条调试信息");
DEBUG("第二条调试信息");
DEBUG("第三条调试信息");
DEBUG("第三条调试信息a=%d\n",a);//无法进行变参输出
方式3(解决以上两种问题)
C89标准中有几个标准宏定义:
LINE:在源代码中插入当前源代码行号;
FILE:在源文件中插入当前源文件名;
DATE:在源文件中插入当前的编译日期
TIME:在源文件中插入当前编译时间;
STDC:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
#define DEBUG(format, …) printf (format, ##VA_ARGS)
DEBUG(“FILE: %s, LINE: %d…”,FILE,LINE,…)
__FILE__本身就会被编译器置换为字符常量,再进一步替换
DEBUG(“FILE:“FILE”, LINE: %d”,_LINE)
欲望是没有止境的,为什么每条语句都要写"FILE:“FILE”, LINE: %d "及__LINE这两个部分呢,这是不是太繁琐了?这是不是太繁琐了?这是不是太繁琐了?
#define DEBUG(format_ql,...)\
printf(" FILE: "__FILE__" LINE: %d: "format_ql"\n ", __LINE__, ##__VA_ARGS__)
//调用方法与上相同,不同的是去掉了保留名__VA_ARGS__
#define DEBUG(fmt,arg...) printf("FILE NAME:"__FILE__ "\r\n""LINE:%d\r\n"fmt"\r\n\n",__LINE__,##arg)
//注释掉调试信息
#define DEBUG(format_ql,...)