1

鉴于我有这个功能:

void A::IAmCool(int x, ...)
{
        va_list args; 
        va_start (args, x);   
        va_end (args);
}

如何将 var-args 从一个函数传递到另一个函数?我正在寻找这样的东西:

void A::extractedFunction() /* this doesn't work */
{
        va_list args; 
        va_start (args, ?????);   
        va_end (args);
}

void A::IAmCool(int x, ...)
{
        extractedFunction();
}

这甚至可能吗?我尝试过使函数内联,但这不起作用。

4

2 回答 2

1

通常的模式是使用 valist 实现您的主要主力函数,而可变参数函数仅作为“装饰”。然后您可以直接从第三方调用站点使用主要功能。例子:

#include <cstdarg>

int vgizmo(int a, std::va_list ap)
{
    // main implementation here!
}

int gizmo(int a, ...)  // interface function
{
    std::va_list ap;
    va_start(ap, a);
    int r = vgizmo(a, ap);
    va_end(ap);
    return r;
}

void some_other_stuff(bool q, char const * fmt, ...)
{
    std::va_list ap;
    va_start(ap, fmt);

    // ...

    int b = vgizmo(x, ap);   // third parties use vgizmo directly

    // ...

    va_end(ap);
}
于 2012-05-25T21:12:41.090 回答
0

在类 C 语言(C、C++、Objective-C 等)中,您不能直接传递可变参数。但是,您可以(如果您正在开发一个外部库,或者您只是想促进逆向工程师的工作,您应该)提供您的函数的非可变参数版本,并使可变参数版本只是包装它,这样您可以根据需要将尽可能多的参数传递给您的函数——使用va_list. 例子:

// variadic function
void variadic_func(int nargs, ...)
{
    // just wrap the non-variadic one
    va_list args;
    va_start(args, nargs);
    non_variadic_func(nargs, args);
    va_end(args);
}

// non-variadic function
void non_variadic_func(int nargs, va_list args)
{
    // do what you want with `args'
}

// you can pass down varargs like this:
void outmost_caller_func(int nargs, ...)
{
    // since you can't pass down the `...', you create a va_list argument list
    va_list args;
    va_start(args, nargs);
    // and call the non-variadic version of your function, just like the wrapper
    // would do (anyway, the wrapper is only for convenience...)
    non_variadic_func(nargs, args);
    va_end(args);
}
于 2012-05-25T21:09:04.320 回答