一般在写一个项目的时候,为了更直观的调试,我们在程序里都会打printf调试语句,随着项目越写越多,printf也会越来越多,但项目准备结尾的时候,这时候开始优化就会发现,你想完全把printf语句都删除了,又怕后面项目出问题找不到问题点在哪里,不删项目一执行就有好多调试语句干扰观察,同时还会拖慢系统,影响效率,这点在单片机上是见怪不怪了,还有一种情况,有时候打印会打相同的消息,这样就分不清到底是哪个函数打印的,于是找问题都要找好久,于是我们需要一个更加有艺术感的调试封装。
#define __DEBUG_VERSION #ifdef __DEBUG_VERSION #define DEBUG(format,...) printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__) #else #define DEBUG(format,...) #endif
如上代码,当定义了__DEBUG_VERSION,使用DEBUG函数就会执行
printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
如果没有定义,那么就什么都不会执行,我们可以在第一篇文章那个例程里实验看看:
#include <stdio.h> #include "iniparser.h" #define CONFIG_NAME "Config.ini" #define __DEBUG_VERSION #ifdef __DEBUG_VERSION #define DEBUG(format,...) printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__) #else #define DEBUG(format,...) #endif void Create_Default_InI_File(void) { FILE *Default_ini = NULL ; Default_ini = fopen(CONFIG_NAME,"w"); fprintf(Default_ini, "[Setting]\n" "INIT_FLAG=0;\n" "VOLUME=1;\n" "LANGUAGE=1;\n" ); fclose(Default_ini); } int main(void) { int Init_flag ; int Volume_flag ; int English_flag ; /*1、创建一个默认的Config.ini文件*/ Create_Default_InI_File(); /*2、解析Config.ini文件获得参数*/ dictionary *Config_ini = NULL; /*3、加载Config.ini文件*/ Config_ini = iniparser_load(CONFIG_NAME); if(NULL == Config_ini) { printf("cannot parse %s file\n",CONFIG_NAME); return -1 ; } /*4、将字典转储到打开的文件指针。*/ iniparser_dump(Config_ini,stderr); /*5、分别获取上述创建的InI文件里的几个项目的值*/ Init_flag = iniparser_getint(Config_ini,"Setting:INIT_FLAG",-1); Volume_flag = iniparser_getint(Config_ini,"Setting:VOLUME",-1); English_flag = iniparser_getint(Config_ini,"Setting:LANGUAGE",-1); DEBUG("Init_flag:%d\n",Init_flag); DEBUG("Volume_flag:%d\n",Volume_flag); DEBUG("English_flag:%d\n",English_flag); /*5、更改其中的INIT_FLAG项的值*/ iniparser_set(Config_ini,"Setting:INIT_FLAG","1"); Init_flag = iniparser_getint(Config_ini,"Setting:INIT_FLAG",-1); Volume_flag = iniparser_getint(Config_ini,"Setting:VOLUME",-1); English_flag = iniparser_getint(Config_ini,"Setting:LANGUAGE",-1); DEBUG("Init_flag:%d\n",Init_flag); DEBUG("Volume_flag:%d\n",Volume_flag); DEBUG("English_flag:%d\n",English_flag); /*6、释放字典*/ iniparser_freedict(Config_ini); return 0; }
运行结果:
当你打印的时候,调试会告诉你这是哪个文件哪一行打的,是不是很方便?但是这样的仅仅起到一个要不全部不执行,要不全执行的效果。如果想做更强大一点,那我们可以结合C语言宏定义的特性把这个再给优化一下,这点留给读者自己去尝试。