1. 程式人生 > >C/C++ 中利用debug巨集定義開啟/關閉除錯輸出

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