在項目開發的過程中,不可避免的會遇到調試代碼的情況。
剛開始寫代碼時,我們想看具體執行到哪兒時,往往這么寫:
printf("***** Code is here! *****\n");
隨着調試信息的不斷增多,我們項目中的printf()函數到處都是,因此,當調試完成時,發現需要注釋掉所有的調試代碼將非常痛苦。於是,我們通過宏定義對代碼進行了這樣的改造:
首先,定義調試宏:
#define _DEBUG_IS_MY
然后,在需要添加調試代碼的地方,添加以下代碼:
#ifdef _DEBUG_IS_MY
printf("***** Code is here! *****\r\n");
#endif
這樣,似乎解決了問題,但這會使項目代碼顯得很臃腫,並且太多重復代碼(#ifdef _DEBUG_IS_MY ……#endif),這是程序員不能容忍的。
因此,參考很多底層代碼和網絡資料,看到確實已經有很優秀和成熟的寫法:
/*
* 自定義調試宏。
* 1.快速切換debug版本和relese版本工程
* 2.簡化打印調試語句的編寫,提高開發調試效率
*/
#define _MY_DEBUG_ 1
#ifdef _MY_DEBUG_
#define MY_DEBUG_PRINT_INFO(...) printf(__VA_ARGS__)
#define MY_DEBUG_PRINT_VAR(X, ...) printf("file: "__FILE__", Line: %d:"X"\r\n",__LINE__,##__VA_ARGS__)
#else
#define MY_DEBUG_PRINT_INFO(...)
#define MY_DEBUG_PRINT_VAR(X, ...)
#endif
在程序中需要添加調試代碼處,直接調用:
MY_DEBUG_PRINT_INFO("code is here!");
或
MY_DEBUG_PRINT_VAR("code is here!");
或
MY_DEBUG_PRINT_VAR("recev_flag = %d .", recev_flag);
即可實現調試信息正常輸出,如下圖所示:

注意:
1、windows下的回車換行符為“\r\n”。
2、用到了預定義宏,這些宏提供了當前編譯和編譯器本身的信息。
__LINE__:在源代碼中插入當前源代碼行號;
__FILE__:在源文件中插入當前源文件名;
以上兩個宏,還可以用作錯誤檢測。例如被零除的問題。
#define CHECK_ZERO(divisor) \
if (0 == divisor) \
printf("attemp to divide by 0 on line %d of file %s ***\r\n", __LINE__, __FILE__);
CHECK_ZERO宏應該在除法運算前被調用。
CHECK_ZERO(j);
k = i / j;
如果 j為0,會打印出以上提示語。
參考以下博客:
1、http://www.360doc.com/content/14/0703/10/7324690_391662898.shtml
2、http://blog.csdn.net/aobai219/article/details/6092292
3、http://blog.csdn.net/cp1300/article/details/7773239
4、《C語言程序設計現代方法》
