其他
让C语言的调试更加高大上
一般在写一个项目的时候,为了更直观的调试,我们在程序里都会打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语言宏定义的特性把这个再给优化一下,这点留给读者自己去尝试。