转自:http://www.cash.idv.tw/wordpress/?p=1531
我大致整理出要點, 供急功近利的新手參考.
1. __VA_ARGS__ 顧名思義, 就是一個可變的參數.
例如: #define ABC(format,…) printf(format, __VA_ARGS__);
注意最後這個分號.
2. 假如實際參數是 0 的話, 會發生下面的問題
ABC(“%s”) –> printf(“%s”,);
為了除去這個逗號, 可以用 ## 來提示 compiler.
例如: #define ABC(format,…) printf(format, ##__VA_ARGS__);
3. __VA_ARGS__ 可以被抽象化成一個變數, 但語法有些不同. (感謝 Anson 網友提醒)
例如: #define ABC(format, arg…) printf(format, ##arg);
4. 以上講的是 macro 的使用, 在 function 當中一樣可以用 …
例如: int function(char *argv, …)
這個可以用來處理 command line 參數的情況, 因為參數可多可少.
function 當中可以用 ##__VA_ARGS__ 來傳遞 … 所代表的值給其他 function.
或是透過 va_list, va_start, va_arg, va_end 這四個標準函式庫把 argv 裡面放的東西一一取出來. 用法參見:
http://www.cplusplus.com/reference/clibrary/cstdarg/va_start.html 有使用範例
http://ehome.hifly.to/showthread.php?s=&threadid=329 有原始 macro code, 也有範例, 呃…, 還有一連串的討論.
———————————————
關於如何巧妙運用 __VA_ARGS_, 在網路上的這篇文章, 有很好的介紹, 大家可以去看.
http://www.jeffhung.net/blog/articles/jeffhung/1012/