__VA_ARGS__ 與 ## 小檔案

转自: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/ 

你可能感兴趣的:(__VA_ARGS__ 與 ## 小檔案)