在工做中遇到一種問題,須要在可變參函數中將可變參數傳遞給另外的函數調用,因而想固然的寫了以下代碼:
函數
void vTestFun_1(const char* fmt, ...) { ... vTestFun_2(fmt, ...); ... } void vTestFun_2(const char* fmt, ...) { //TODO }
而後就理所固然的囧了,編譯器告訴我不能這麼用,那隻能找其餘方法了。
code
因而,新的代碼以下:orm
void vTestFun_1(const char* fmt, va_list argp) { //TODO } void vTestFun_2(const char* fmt, ...) { va_list args; va_start(args, fmt); ... vTestFun_1(fmt, args); ... va_end(args); }
後來,看Log4cpp源碼的時候,發現其中也有相似這樣的函數調用:
編譯器
void Category::_logUnconditionally(Priority::Value priority, const char* format, va_list arguments) throw() { _logUnconditionally2(priority, StringUtil::vform(format, arguments)); } void Category::log(Priority::Value priority, const char* stringFormat, ...) throw() { if (isPriorityEnabled(priority)) { va_list va; va_start(va, stringFormat); _logUnconditionally(priority, stringFormat, va); va_end(va); } }
綜上,若想將可變參數進行傳遞,不能簡單的使用...來進行傳遞,這種想固然的方法直接被編譯器秒殺……一般先將可變參數...轉爲va_list,而後將va_list傳遞給其餘函數進行處理,這樣就變相實現了可變參數的傳遞。
源碼