在c ++中处理va_args

时间:2012-02-17 13:51:31

标签: c++ function arguments

我有一个功能A(...)B(...)。现在我必须在B内调用A,将...A传递到B的任何方法?伪代码:

void A(...)
{
   // Some operators
   B(...); // Instead of ... I need to pass A's args
}

P.S。我知道这可以使用宏完成,但功能如何。

3 个答案:

答案 0 :(得分:7)

您无法转发va_args。你只能转发va_list。

void vB(int first, va_list ap)
{
   // do stuff with ap.
}

void B(int first, ...)
{
   va_list ap;
   va_start(ap, first);
   vB(first, ap);
   va_end(ap);
}

void A(int something_else, int first, ...)
{
   va_list ap;
   va_start(ap, first);
   vB(first, ap);       // <-- call vB instead of B.
   va_end(ap);
}

(这也是vprintf等函数存在的原因。)


如果您使用的是C ++ 11,则可以使用具有完美转发功能的可变参数模板执行此操作:

template <typename... T>
void A(T&&... args)
{
    B(std::forward<T>(args)...);
}

答案 1 :(得分:2)

不幸的是,您无法获取va-list并将其传递给接受变量参数列表的函数。没有语法允许您将va_args结构扩展回参数。

您可以在单个参数中将其作为va_list传递,因此一种解决方案是将执行工作的函数定义为va_list。然后你可以使用参数列表定义另一个包装它的函数,然后可以将va_list传递给核心函数并将返回值传回。您可以在C标准库中看到这种模式,其中包含printf()vprintf()以及类似的配对。

答案 2 :(得分:1)

您需要稍微更改方法的签名。我假设你想做这样的事情:

void B(int numParams, va_list parameters)
{
    // Your code here. Example:
    for (int i=0; i<numParams; i++)
    {
        // Do something using va_arg to retrieve your parameters
    }
}

void A(int numParams, ...)
{
    va_list parameters;
    va_start(parameters, numParams);
    B(numParams, parameters);
    va_end(parameters);
}