1

省略記号を使用して、さまざまなデータ型の可変数の引数を受け入れる関数があります。私はそれらのそれぞれを得ることができる方法があることを知りたかった. すべてではない場合、少なくとも特定の引数 (最初または最後のパラメーターのいずれか) を残りから分離し、 va_listを残りから分離します。
宣言は次のようになります。

    int foo (char *a , ...)

使用法 :

    result = foo ("I'm a String",2,34.56,"one more String",2323232323);

    result = foo ("I'm another String",3,"again one more String",34.62,111111111);

そこで、ここ(使用法 1) 取得した va_list からパラメーター '2' を削除し、残りで別の va_list を作成します。関数宣言は柔軟で、それに応じて変更できます。
前もって感謝します

4

2 に答える 2

1

可変引数関数には、省略記号 ( va_list) 内の引数の型を判別する方法が必要であることに注意してください。関数のprintf()およびscanf()ファミリには、型を指定する書式文字列があります。open()システム コールにはオプションの 3 番目の引数がありますが、常に;intです。関数は、NULL ポインターで終了する、execl()すべて同じ型の引数のリストを受け取ります)。char *

関数がある場合:

void foo_tail(va_list args);

関数は次のように記述できますfoo()

int foo(char *a, ...)
{
    va_list args;
    va_start(args, a);
    int arg2 = va_arg(args, int);
    foo_tail(args);
    va_end(args);
    return arg2;
}

これにより、質問が求めるものが達成されます。

get からパラメーター '2' を削除し、残りを使用しva_listて別のパラメーターを作成します。va_list

foo_tail()与えられたもので何をすべきかを解決できるかどうかva_listは、別の議論です。質問に示されている2つの呼び出しをどのように区別するかは明確ではありませんが、両方を処理するには、その情報を何らかの方法で利用できるようにする必要があります. 示されている混合型の変数リストは非常に問題があります。

于 2013-04-19T17:46:06.013 に答える