您好,登錄后才能下訂單哦!
函數與調試
正常程序的調試使用gdb。但有時也會在程序中通過使用printf(),打印關鍵信息進行bug定位及調試。接下來通過實踐不斷優化改善:
1,通過在程序中直接使用printf()函數進行開發調試。但在開發調試測試結束后,必須刪除相應的調試打印函數(printf)。因為過多的打印函數存在會影響效率,所以上線時會刪掉調試打印函數。但這樣就導致了生成程序出現bug需測試環境調試定位時,又得重新書寫printf進行打印調試。
2,通過使用DEBUG來控制printf函數的調用使用如下:
void test( void ) { /* do something */ #ifdef DEBUG printf("Tets Debug\n"); #endif /* do something */ }
若想打印出printf信息,只要在編譯時加入DEBUG選項即可。使用如下:gcc -DDEBUG main.c
此時雖然在DEBUG是已經滿足要求,需要調試時才會執行。更不會影響生產線的執行效率。但過多的#ifdef和#endif嵌套會影響代碼風格,且會影響可讀性。故有了下一版本。
3,使用宏處理。
定義個DEBUG_WRITE宏,在調試狀態時指向write_debug函數;非調試狀態DEBUG_WRITE定義變成了(void)。
使用stderr而不是stdout的原因是:stderr不存在緩存。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #ifdef DEBUG #define WRITE_DEBUG( arg ) write_debug arg #else #define WRITE_DEBUG( arg ) #endif /** * @brief debug日志信息打印函數 * * @param fmt */ void write_debug( char *fmt, ... ) { va_list vl; va_start( vl, fmt ); vfprintf( stderr, fmt, vl ); va_end( vl ); } int main( int argc, char *argv[] ) { int num = 10; char *str = "szyu"; /* 使用時里面的括號不能省略 */ WRITE_DEBUG( ( "num...%d, str...%s\n", num, str ) ); return 0; }
較之前版本,風格統一且不影響可讀性。
本文參考自《征服C指針》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。