debug宏作为调试开关
在写程序时,为了调试,经常需要加一些输出语句,等调试完成又得注释掉,如果下次还需要调试还得解注释,十分费时费力,为了解决这个麻烦,可以定义一个debug宏作为调试输出的开关。如下面代码所示:
#include
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
1
DBGprint宏作为调试输出
只是像上面那样利用debug宏的话还是很麻烦,因为每次都要写#ifdef DEBUG,为此,我们可以定义个DBGprint宏作为调试输出,当需要调试输出时(有DEBUG宏定义)就将其定义为printf函数,否则就定义为空。如下例所示:
#include
#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