一般在調試打印Debug信息的時候, 需要可變參數的宏. 從C99開始可以使編譯器標准支持可變參數宏(variadic macros), 另外GCC也支持可變參數宏, 但是兩種在細節上可能存在區別.
1. __VA_ARGS__
__VA_ARGS__ 將 "..." 傳遞給宏 . 如
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
2. GCC的復雜宏
GCC使用一種不同的語法,從而可以給可變參數一個名字,如同其它參數一樣.
#define debug(format, args...) fprintf (stderr, format, args)
這和第一條的宏例子是完全一樣的,但是這麼寫可讀性更強並且更容易進行描述.
3. ##__VA_ARGS__
上面兩個定義的宏,如果出現 debug("A Message")的時候,由於宏展開後有個多余的逗號,所以將導致編譯錯誤.
為了解決這個問題,CPP 使用一個特殊的"##"操作,格式如下:
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
這裡,如果可變參數被忽略或為空,"##"操作將使預處理器(preprocessor)去除掉它前面的那個逗號.