2011-01-26 13 views
10

追加の引数の数が不明な場合、どのようにva_listをループするのですか? 引数の数が不明な場合、va_listをループする方法は?

#include <stdio.h> 
#include <stdarg.h> 

int add(int x, int y, ...) { 
    va_list intargs; 
    int temp = 0; 

    va_start(intargs, y); 
    int i; 
    for (i = 0; i < 3; i++) { /* How can I loop through any number of args? */ 
     temp += va_arg(intargs, int); 
    } 
    va_end(intargs); 

    return temp + x + y; 
} 

int main() { 
    printf("The total is %d.\n", add(1, 2, 3, 4, 5)); 
    return 0; 
} 
+0

おそらく最後にNULLが必要になります。 –

+0

ありがとう、これは実際に私が今取っているアプローチです。私はコールの開始時にargカウンタを使うよりも簡単だと思います。最後にNULLを置く方が簡単です。 – Bob

答えて

14

は(あなたが移植可能なコードを書いている場合)、可変長引数リストを使用するときは、何らかの形でパラメータの数を示す必要があり、ターミネーターとして、例えばNULLまたは-1

+1

0または負の数を追加する場合はどうなりますか? 'va_arg(intargs、int)'はNULLを0にキャストします。 –

+0

例:http://www.cplusplus.com/reference/cstdarg/va_end/ – dlchambers

2

おそらく、最初のパラメータとして引数の数を渡すような何かをしたいです。

など。ここを参照してください:ここ http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

そして、より多くの議論:私はそれらを回避しようと思い、すべての可能なので、もしhttp://www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/

可変引数は危険です。サイズと要素配列へのポインタを含む "ベクトル"型を渡す方が安全です。

+0

ありがとうございます、私はANSI Cを使用していますが、これを回避する他の方法はないと思います。 – Bob

+0

@Bob:配列のint *とサイズを渡します。最後のNULLの問題は、ある時点で誰かがそれを忘れてしまい、バグをデバッグするのが難しくなる可能性があります。 –

17

をセンチネル値を使用します。あなたは今考えているかもしれませんが、printfはあなたに多くの議論を示す必要はありません!

真であるが、数値は最初に%format指定子の書式文字列を解析することによって推測することができる。

関連する問題