在工做中遇到一种问题,须要在可变参函数中将可变参数传递给另外的函数调用,因而想固然的写了以下代码:
函数
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传递给其余函数进行处理,这样就变相实现了可变参数的传递。
源码