printf()和fprintf()這些輸出函數的參數是可變的,在調試程序時,你可能希望定義自己的參數可變的輸出函數,
那么可變參數宏會是一個選擇。
C99中規定宏可以像函數一樣帶有可變參數,比如
#define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__)
其中,...表示參數可變,__VA_ARGS__在預處理中為實際的參數集所替換
GCC中同時支持如下的形式
#define LOG(format, args...) fprintf(stdout, format, args)
其用法和上面的基本一致,只是參數符號有變化
有一點需要注意,上述的宏定義不能省略可變參數,盡管你可以傳遞一個空參數,這里有必要提到"##"連接符號的用法。
"##"的作用是對token進行連接,在上例中,format、__VA_ARGS__、args即是token,
如果token為空,那么不進行連接,所以允許省略可變參數(__VA_ARGS__和args),對上述變參宏做如下修改
#define LOG(format, ...) fprintf(stdout, format, ##__VA_ARGS__) #define LOG(format, args...) fprintf(stdout, format, ##args)
上述的變參宏定義不僅能自定義輸出格式,而且配合#ifdef #else #endif在輸出管理上也很方便,
比如調試時輸出調試信息,正式發布時則不輸出,可以這樣
#ifdef DEBUG #define LOG(format, ...) fprintf(stdout, ">> "format"\n", ##__VA_ARGS__) #else #define LOG(format, ...) #endif
在調試環境下,LOG宏是一個變參輸出宏,以自定義的格式輸出;
在發布環境下,LOG宏是一個空宏,不做任何事情。
From http://www.cnblogs.com/caosiyang/