va_list中传递的参数数量

时间:2013-03-04 09:13:45

标签: c variadic-functions

所有

我想在va_list中控制the number of passed parameters

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

是否有可能在va_start之后获取参数数量?

2 个答案:

答案 0 :(得分:2)

不完全是您想要的,但您可以使用此宏来计算参数

#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(...) fnexec(NARGS(__VA_ARGS__) - 1, __VA_ARGS__)

static void fnexec(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;
}

答案 1 :(得分:1)

你无法直接计算它们。

例如printf是一个变量计数函数,它使用其第一个参数来计算以下参数:

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

函数printf首先解析它的第一个参数("%s %i %d"),然后估计还有3个参数。

在您的情况下,您必须解析fmts ans extract % - 说明符然后估计其他参数。实际上每个%[flags][width][.precision][length]specifier都可以算作一个参数。 read more...