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

通常のパターンは、バリストを取る主な主力関数を実装し、可変個引数関数を「装飾」としてのみ実装することです。その後、サードパーティの呼び出しサイトから main 関数を直接使用できます。例:

#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 に答える