一般在調(diào)試打印Debug信息的時(shí)候, 需要可變參數(shù)的宏. 從C99開(kāi)始可以使編譯器標(biāo)準(zhǔn)支持可變參數(shù)宏(variadic macros), 另外GCC也支持可變參數(shù)宏, 但是兩種在細(xì)節(jié)上可能存在區(qū)別.
1. __VA_ARGS__
__VA_ARGS__ 將 "..." 傳遞給宏 . 如
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
2. GCC的復(fù)雜宏
GCC使用一種不同的語(yǔ)法,從而可以給可變參數(shù)一個(gè)名字,如同其它參數(shù)一樣.
#define debug(format, args...) fprintf (stderr, format, args)
這和第一條的宏例子是完全一樣的,但是這么寫(xiě)可讀性更強(qiáng)并且更容易進(jìn)行描述.
3. ##__VA_ARGS__
上面兩個(gè)定義的宏,如果出現(xiàn) debug("A Message")的時(shí)候,由于宏展開(kāi)后有個(gè)多余的逗號(hào),所以將導(dǎo)致編譯錯(cuò)誤.
為了解決這個(gè)問(wèn)題,CPP 使用一個(gè)特殊的"##"操作,格式如下:
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
這里,如果可變參數(shù)被忽略或?yàn)榭?"##"操作將使預(yù)處理器(preprocessor)去除掉它前面的那個(gè)逗號(hào).