在工作中遇到一种问题,需要在可变参函数中将可变参数传递给另外的函数调用,于是想当然的写了如下代码:
void vTestFun_1(const char* fmt, ...)
{
...
vTestFun_2(fmt, ...);
...
}
void vTestFun_2(const char* fmt, ...)
{
//TODO
}
然后就理所当然的囧了,编译器告诉我不能这么用,那只能找其他方法了。
于是,新的代码如下:
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传递给其他函数进行处理,这样就变相实现了可变参数的传递。