0

任意の数の引数を取り、引数の値のみを出力できる C 関数を作成したいと考えていますintva_listとを見ましたva_argstdarg.h、引数の数を取得するメカニズムが見つかりませんでした。最初の引数を引数の数として取ることができません。

4

3 に答える 3

2

標準 C には、可変引数関数の引数の数を取得するための移植可能な方法はありません。

これを解決する一般的な方法は、右端のパラメーターparmNを使用して整数の数を明示的に指定することです。たとえば、関数プロトタイプは次のようになります。

int foo(int number, ...);

しかし、あなたの質問によると、これはあなたにとって選択肢ではありません。

参照: C FAQ : 関数が実際に呼び出された引数の数を調べるにはどうすればよいですか?

于 2013-10-16T08:44:12.633 に答える
0

NARGS マクロの使用 (この場合、8 つの引数に制限されています):

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

#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)

#define fn(...) fn(NARGS(__VA_ARGS__), __VA_ARGS__)

static void (fn)(int n, ...)
{
    va_list args;
    int i;

    va_start(args, n);
    for (i = 0; i < n; i++) {
      printf("%d\n", va_arg(args, int));
    }
    va_end(args);
}

int main(void)
{
    fn(6, 7, 8);
    return 0;
}

または、-1 までループできます。

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

#define fn(...) fn(0, __VA_ARGS__, -1)

static void (fn)(int n, ...)
{
    va_list args;
    int i;

    va_start(args, n);
    while (1) {
        i = va_arg(args, int);
        if (i == -1) break;
        printf("%d\n", i);
    }
    va_end(args);
}

int main(void)
{
    fn(6, 7, 8);
    return 0;
}
于 2013-10-16T08:43:12.480 に答える