如果不用可變參數宏
最簡單的方法:
#ifdef _DEBUG
#define DebugMsg printf
#else
#define DebugMsg //printf
#endif
在 GNU C 中,宏可以接受可變數目的參數,就象函數一樣,例如:
#define pr_debug(fmt,arg...) \
printk(KERN_DEBUG fmt,##arg)
用可變參數宏(variadic macros)傳遞可變參數表
你可能很熟悉在函數中使用可變參數表,如:
void printf(const char* format, …);
直到最近,可變參數表還是只能應用在真正的函數中,不能使用在宏中。
C99編譯器標準終于改變了這種局面,它允許你可以定義可變參數宏(variadic macros),這樣你就可以使用擁有可以變化的參數表的宏。可變參數宏就像下面這個樣子:
#define debug(…) printf(__VA_ARGS__)
缺省號代表一個可以變化的參數表。使用保留名 __VA_ARGS__ 把參數傳遞給宏。當宏的調用展開時,實際的參數就傳遞給 printf()了。例如:
Debug(“Y = %d\n”, y);
而處理器會把宏的調用替換成:
printf(“Y = %d\n”, y);
因為debug()是一個可變參數宏,你能在每一次調用中傳遞不同數目的參數:
debug(“test”); //一個參數
可變參數宏不被ANSI/ISO C++ 所正式支持。因此,你應當檢查你的編譯器,看它是否支持這項技術。
VC:使用可變參數宏
VC6是不支持可變參數宏的,VC2005支持。
使用如下:
#define TRACE(pszFormat, ...) \
CTL_CommonLogger::Output(LOGGER, LEVEL_TRACE, pszFormat, __VA_ARGS__);
其中,__VA_ARGS__就是不定參數。
注意:直接這樣,是沒法編譯通過的,因為這個宏要求編譯器是VC2002(VC7.0)以上的版本,也就是說,_MSC_VER宏應該是1400以上的值。所以,使用前,應該加上如下的定義:
#ifndef _MSC_VER
#define _MSC_VER 1600
#endif
1600也就是VC8.0。
補充:改一下。CTL_CommonLogger::Output是一個類的靜態成員函數。
類似,可以使用下面的寫法:
#define PRINT(x, ...) \
Print(x, __VA_ARGS__);
Print函數的原型:int Print(char * x, ...);
不定參數函數的實現,可以參考Windows的TRACE宏或ATLTRACE宏。