全て、
the number of passed parameters
va_list で制御したい。
va_list args;
va_start(args, fmts);
vfprintf(stdout, fmts, args);
va_end(args);
の直後にパラメータの数を取得する可能性はありますva_start
か?
全て、
the number of passed parameters
va_list で制御したい。
va_list args;
va_start(args, fmts);
vfprintf(stdout, fmts, args);
va_end(args);
の直後にパラメータの数を取得する可能性はありますva_start
か?
まさにあなたが望むものではありませんが、このマクロを使用してパラメーターをカウントできます
#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;
}
それらを直接数えることはできません。
たとえばprintf
、次の引数をカウントするために最初のパラメーターを使用する可変カウント関数があります。
printf("%s %i %d", ...);
関数printf
は最初に最初の引数 ( "%s %i %d"
) を解析し、さらに 3 つの引数があると推定します。
あなたの場合、fmts
ans extract %
-specifiers を解析してから、他の引数を推定する必要があります。実際には、それぞれ%[flags][width][.precision][length]specifier
が引数として数えられます。続きを読む...