代码中的log信息有助于日常的代码调试。但是,当代码功能已经调试完毕,对外进行发布的时候,又需要把好不容易添加上的log信息删除。而这些log以后还可能需要用到,这时如果能够定义一个打印日志的开关就好了。下面代码中定义了四种简单的log开关的例子。
#include <stdio.h> #include <stdarg.h> #define __DEBUG__ //宏开关 /************************************************** //方法1: //用宏DebugMessagePrint(flag)来代替 printf flag //注:使用该方法,需要使用双括号,否则会出现编译错误。 //如: //DebugMessagePrint(("print time: %d \n",time(NULL))); **************************************************/ #ifdef __DEBUG__ #define DebugMessagePrint(flag) printf flag #else #define DebugMessagePrint(flag) ((void)0) #endif /************************************************** //方法2: //在函数体中声明一个va_list,然后用va_start函数来获 //取参数列表中的参数,使用完毕后调用va_end()结束 //注: 使用该方法需要包括stdarg.h头文件 **************************************************/ #ifdef __DEBUG__ void debug(const char *fmt, ...) { \ va_list ap; \ va_start(ap, fmt); \ vprintf(fmt, ap); \ va_end(ap); \ } #else void debug(const char *fmt, ...) { } #endif /************************************************** //方法3: //定义宏DbgPrintf来替换printf **************************************************/ #ifdef __DEBUG__ #define DbgPrintf printf//使用\换行符注释 #else #define DbgPrintf ((void)0) #endif /************************************************** //方法4: //定义宏DBG(CODE),使用时,CODE为全部的打印内容 **************************************************/ #ifdef __DEBUG__//方法4 #define DBG(CODE) CODE #else #define DBG(CODE) #endif void main() { int count =1; printf("Use printf : %d \n", count); DebugMessagePrint(("Use DebugMessagePrint: %d \n",count)); debug("use debug: %d \n",count); DbgPrintf("use DbgPrintf: %d \n",count); DBG(printf("use DBG: %d \n",count);) }
打印结果:
Use printf : 1
Use DebugMessagePrint: 1
use debug: 1
use DbgPrintf: 1
use DBG: 1
从上面四种定义的方法看,第2种方法和第3种方法比较符合日常使用方式。