作者DrStein (啤酒肚)
看板C_and_CPP
標題[問題] printf 比__VAR_ARGS__ 更好的宏
時間Sat May 28 13:53:42 2011
就想設個宏 讓他在 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