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