看板 C_and_CPP 關於我們 聯絡資訊
就想設個宏 讓他在 debug 會打印出來 但release 不會 這該是老生常談的問題: 不管windows 還是 linux 都該是這樣 : /*vc*/ #define PRINT(FMT, ...) fprintf(stderr, FMT, __VA_ARGS__) /*gcc*/ #define PRINT(FMT, ARGS...) fprintf(stderr, FMT,ARGS) /*g++*/ #define PRINT(FMT, ...) fprintf (stderr, FMT, ## ARGS) 然後再定個: #define DEBUG_PRINT(ARG) (PRINT("DEBUG: "), PRINT(ARGS)) 這樣看起來不錯 但討驗的是,在DEBUG_PRINT未定意時 DEBUG_PRINT 這被替換為 空,後面的;又沒被忽略掉: ex : if(TRUE === someLogic ) { DEBUG_PRINT("someLogic is TRUE\n"); /*do some time */ : }/*if TRUE === someLogic*/ DEBUG_PRINT沒被定意時,被換為: if(TRUE === someLogic ) { ; /*do some time */ : }/*if TRUE === someLogic*/ 編譯器就會靠杯了。 令一個方法是用 void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); 這究不詳束 詳見 http://hi.baidu.com/funrole/blog/item/6aaefaec3131e4c32e2e21ee.html 實作就是 #include <stdarg.h> void debug_print(const char *fmt, ...) { #ifdef _DEBUG int nBuf; char szBuffer[1024]; va_list args; va_start(args, fmt); nBuf = vsprintf(szBuffer, fmt, args) ; assert(nBuf >= 0); frintf(stderr,"QDOGC ERROR:%s\n",szBuffer); va_end(args); #endif /*_DEBUG*/ }/*debug_print*/ 這樣更不好 程式進到個空函數降低效能,雖然編譯器會加以優化, 但多少還是毛毛的 那請問板上高手有沒更好的做法呢 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.115.132.79 ※ 編輯: DrStein 來自: 58.115.132.79 (05/28 13:54)
Bencrie:翻譯蒟蒻:宏 == Macro == 巨集 05/28 14:10
scwg:#ifndef DEBUG_PRINT #define DEBUG_PRINT ((void)0) 05/28 14:11
POSIX:orz .... 大陸用語 05/28 15:20
softwind:android/kernel/include/linux/kernel.h 05/29 02:10
alongalone:建議還是選一下字.... 05/29 08:57