[资料分享] C/C++ 中利用debug宏定义打开/关闭调试输出

Aguilera   2019-3-17 18:08 楼主
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   

回复评论 (1)

楼主好资料
点赞  2019-3-18 08:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复