[C/C++]可变参数传递

    在工作中遇到一种问题,需要在可变参函数中将可变参数传递给另外的函数调用,于是想当然的写了如下代码:

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传递给其他函数进行处理,这样就变相实现了可变参数的传递。

转载于:https://my.oschina.net/u/1429862/blog/222903

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值