讓C語言的調(diào)試更加高大上
一般在寫一個(gè)項(xiàng)目的時(shí)候,為了更直觀的調(diào)試,我們?cè)诔绦蚶锒紩?huì)打printf調(diào)試語句,隨著項(xiàng)目越寫越多,printf也會(huì)越來越多,但項(xiàng)目準(zhǔn)備結(jié)尾的時(shí)候,這時(shí)候開始優(yōu)化就會(huì)發(fā)現(xiàn),你想完全把printf語句都刪除了,又怕后面項(xiàng)目出問題找不到問題點(diǎn)在哪里,不刪項(xiàng)目一執(zhí)行就有好多調(diào)試語句干擾觀察,同時(shí)還會(huì)拖慢系統(tǒng),影響效率,這點(diǎn)在單片機(jī)上是見怪不怪了,還有一種情況,有時(shí)候打印會(huì)打相同的消息,這樣就分不清到底是哪個(gè)函數(shù)打印的,于是找問題都要找好久,于是我們需要一個(gè)更加有藝術(shù)感的調(diào)試封裝。
如上代碼,當(dāng)定義了__DEBUG_VERSION,使用DEBUG函數(shù)就會(huì)執(zhí)行
printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
如果沒有定義,那么就什么都不會(huì)執(zhí)行,我們可以在第一篇文章那個(gè)例程里實(shí)驗(yàn)看看:
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、創(chuàng)建一個(gè)默認(rèn)的Config.ini文件*/
Create_Default_InI_File();
/*2、解析Config.ini文件獲得參數(shù)*/
dictionary *Config_ini = ;
/*3、加載Config.ini文件*/
Config_ini = iniparser_load(CONFIG_NAME);
if(NULL == Config_ini)
{
printf("cannot parse %s file\n",CONFIG_NAME);
return -1 ;
}
/*4、將字典轉(zhuǎn)儲(chǔ)到打開的文件指針。*/
iniparser_dump(Config_ini,stderr);
/*5、分別獲取上述創(chuàng)建的InI文件里的幾個(gè)項(xiàng)目的值*/
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項(xiàng)的值*/
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;
}
運(yùn)行結(jié)果:
當(dāng)你打印的時(shí)候,調(diào)試會(huì)告訴你這是哪個(gè)文件哪一行打的,是不是很方便?但是這樣的僅僅起到一個(gè)要不全部不執(zhí)行,要不全執(zhí)行的效果。如果想做更強(qiáng)大一點(diǎn),那我們可以結(jié)合C語言宏定義的特性把這個(gè)再給優(yōu)化一下,這點(diǎn)留給讀者自己去嘗試。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!