20

va_list がある場合、そのすべての要素を抽出する方法を知っています。

void printInts(int n,...)
{
    va_list va;
    va_start(va, n);
    for(unsigned int i=0; i<n; i++)
    {
        int arg=va_arg(va, int);
        printf("%d",arg);
    }
    va_end(va);
} 

したがって、printInts(3,1,2,3) を呼び出すと、va_list にすべてのパラメーターが入力されます。
しかし、va_start を使用せずに手動で va_list を埋めるにはどうすればよいでしょうか? 私は次のようなものが欲しいということです:

va_list va;
push_arg(va, int, 5); // And so on until I fill all parameters
...

引数として va_list を受け入れる関数があり、すべてのパラメーターの va_list を埋める方法がわからないため、これが必要です。

4

5 に答える 5

19

va_list を明示的に埋める機能はありません。

ラッパー関数を作成する必要があります。va_list を手動で入力する代わりに、関数 foo を呼び出す必要があるとします。次のように新しい関数を定義します。

void call_foo(int arg1, ...)
{
   va_list ap;
   va_start(ap, arg1);
   foo(arg1, ap);
   va_end(ap);
}

これで、va_list を取るを呼び出すことができますがfoo、好きなように、たとえば call_foo(1,2,3,4);, call_foo(1, 1, "Hello"); を実行します。等

これにより、コンパイル時にのみ引数を指定できます。実行時に引数を作成することはできません。

于 2012-12-04T13:19:53.940 に答える
13

通常、これらの関数はペアになっています。「va-accepting」関数がある場合、別の関数を簡単に作成できます。

void printInts_v(int n, va_list ap)
{
    unsigned int i=0;
    for(i=0; i<n; i++)
    {
        int arg=va_arg(ap, int);
        printf("%d", arg);
    }
}

この関数は、次の方法で呼び出すことができます。

void printInts(int n,...)
{
    va_list ap;
    va_start(ap, n);
    printInts_v(n, ap);
    va_end(va);
}

va_listしかし、後で使用するためにポータブルに事前入力する方法はないと思います。

ただし、1 つのアーキテクチャで作業し、移植性が問題にならない場合は、自分で何かを作成できます。それを正確に行う方法は、プラットフォーム固有です。

于 2012-12-04T13:16:27.850 に答える
0

これを行う標準化された方法はないと思います。一方、このような事前入力va_listは、使用可能な引数の数とタイプを「照会」する方法がないため、ほとんど役に立ちません。

于 2012-12-04T13:14:47.603 に答える