让C语言的调试更加高大上
扫描二维码
随时随地手机看文章
一般在写一个项目的时候,为了更直观的调试,我们在程序里都会打printf调试语句,随着项目越写越多,printf也会越来越多,但项目准备结尾的时候,这时候开始优化就会发现,你想完全把printf语句都删除了,又怕后面项目出问题找不到问题点在哪里,不删项目一执行就有好多调试语句干扰观察,同时还会拖慢系统,影响效率,这点在单片机上是见怪不怪了,还有一种情况,有时候打印会打相同的消息,这样就分不清到底是哪个函数打印的,于是找问题都要找好久,于是我们需要一个更加有艺术感的调试封装。
如上代码,当定义了__DEBUG_VERSION,使用DEBUG函数就会执行
printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
如果没有定义,那么就什么都不会执行,我们可以在第一篇文章那个例程里实验看看:
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语言宏定义的特性把这个再给优化一下,这点留给读者自己去尝试。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!





