C/C++ 中利用debug巨集定義開啟/關閉除錯輸出
阿新 • • 發佈:2019-01-22
debug巨集作為除錯開關
在寫程式時,為了除錯,經常需要加一些輸出語句,等除錯完成又得註釋掉,如果下次還需要除錯還得解註釋,十分費時費力,為了解決這個麻煩,可以定義一個debug巨集作為除錯輸出的開關。如下面程式碼所示:
#include <stdio.h>
int main(void)
{
int i, sum;
for (i = 1, sum = 0; i <= 5; i++)
{
sum += i;
#ifdef DEBUG
printf("sum += %d is %d\n", i, sum);
#endif
}
printf("total sum is %d\n", sum);
}
上面程式碼中,只有定義DEBUG巨集時,才會輸出相加過程,我們可以在gcc編譯時用-D選項定義DEBUG巨集來開啟這個除錯開關,輸出除錯資訊
gcc -D DEBUG test.c
DBGprint巨集作為除錯輸出
只是像上面那樣利用debug巨集的話還是很麻煩,因為每次都要寫#ifdef DEBUG,為此,我們可以定義個DBGprint巨集作為除錯輸出,當需要除錯輸出時(有DEBUG巨集定義)就將其定義為printf函式,否則就定義為空。如下例所示:
#include <stdio.h>
#ifdef DEBUG
#define DBGprint(...) printf(__VA_ARGS__)
#else
#define DBGprint(...)
#endif
int main(void)
{
int i, sum;
for (i = 1, sum = 0; i <= 5; i++)
{
sum += i;
DBGprint("sum += %d is %d\n", i, sum);
}
printf("total sum is %d\n", sum);
}
這樣每次需要新增除錯輸出時只需要寫DBGprint就可以了。
一些除錯輸出的巨集
#define ERROR(...) /
do{ /
fprintf(stderr, "[ERROR ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stderr, __VA_ARGS__); /
}while(0)
#define WARNING(...) /
do{ /
fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define INFO(...) /
do{ /
fprintf(stdout, "[INFO ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define SHOW_TIME(...) /
do{/
extern unsigned long long gLatestTime;/
timeval tp;/
gettimeofday(&tp, NULL);/
unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /
if(gLatestTime != 0) /
{ /
fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/
fprintf(stdout, __VA_ARGS__); /
fprintf(stdout, "/n"); /
} /
gLatestTime = now;/
}while(0)
#ifdef DEBUG
#define DBG(...) /
do{ /
fprintf(stdout, "[DEBUG ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#else
#define DBG(...)
#endif