[問題] print裡 比__VAR_ARGS__ 更好的宏?

看板C_and_CPP (C/C++)作者 (啤酒肚)時間15年前 (2011/05/28 13:53), 編輯推噓3(302)
留言5則, 5人參與, 最新討論串1/2 (看更多)
就想設個宏 讓他在 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)

05/28 14:10, , 1F
翻譯蒟蒻:宏 == Macro == 巨集
05/28 14:10, 1F

05/28 14:11, , 2F
#ifndef DEBUG_PRINT #define DEBUG_PRINT ((void)0)
05/28 14:11, 2F

05/28 15:20, , 3F
orz .... 大陸用語
05/28 15:20, 3F

05/29 02:10, , 4F
android/kernel/include/linux/kernel.h
05/29 02:10, 4F

05/29 08:57, , 5F
建議還是選一下字....
05/29 08:57, 5F
文章代碼(AID): #1Du8teoL (C_and_CPP)
文章代碼(AID): #1Du8teoL (C_and_CPP)