可變參數的宏定義


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM