C/C++ 中利用debug宏定义打开/关闭调试输出

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   
  • 28
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值