3

全て、

the number of passed parametersva_list で制御したい。

va_list args;
va_start(args, fmts);
        vfprintf(stdout, fmts, args);
va_end(args);

の直後にパラメータの数を取得する可能性はありますva_startか?

4

2 に答える 2

3

まさにあなたが望むものではありませんが、このマクロを使用してパラメーターをカウントできます

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

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

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

static void (fn)(int n, const char *fmt, ...)
{
    va_list args;

    va_start(args, fmt);
    printf("%d params received\n", n);
    vprintf(fmt, args);
    va_end(args);
}

int main(void)
{
    fn("%s %d %f\n", "Hello", 7, 5.1);
    return 0;
}
于 2013-03-04T09:57:03.990 に答える
2

それらを直接数えることはできません。

たとえばprintf、次の引数をカウントするために最初のパラメーターを使用する可変カウント関数があります。

printf("%s %i %d", ...);

関数printfは最初に最初の引数 ( "%s %i %d") を解析し、さらに 3 つの引数があると推定します。

あなたの場合、fmtsans extract %-specifiers を解析してから、他の引数を推定する必要があります。実際には、それぞれ%[flags][width][.precision][length]specifierが引数として数えられます。続きを読む...

于 2013-03-04T09:31:43.687 に答える