[問題] print裡 比__VAR_ARGS__ 更好的宏?
就想設個宏 讓他在 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
05/28 14:10, 1F
→
05/28 14:11, , 2F
05/28 14:11, 2F
推
05/28 15:20, , 3F
05/28 15:20, 3F
推
05/29 02:10, , 4F
05/29 02:10, 4F
→
05/29 08:57, , 5F
05/29 08:57, 5F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章