【问题标题】:number of passed arguments in a va_listva_list 中传递的参数数
【发布时间】:2013-03-04 09:13:44
【问题描述】:

全部,

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

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

有没有可能在va_start之后获取参数的数量?

【问题讨论】:

  • 没有,据我所知。只需将数字作为第一个参数传入即可。
  • 你必须自己数数。或查看this
  • 你无法处理参数的数量。
  • 你不能,但你可以使用宏。见this C reference

标签: c variadic-functions


【解决方案1】:

不完全是你想要的,但你可以使用这个宏来计算参数

#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;
}

【讨论】:

    【解决方案2】:

    你不能直接计算它们。

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

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

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

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

    【讨论】:

    • 没错,我想做的是让我的函数(比如 printf 更安全),例如,如果我们有一个 printf(%s%s) 并且我们只传递一个参数,我们将拥有一个问题,因为第二个 %s 不匹配任何参数,所以我们会在输出 bizzard 字符中找到...
    • 你无法避免这些错误,printf 本身不能强制调用者传递与说明符相同的参数。
    • 例如你可以写printf("%i%i", 12);这是错误的但是可能的
    • 在这种情况下,OP 做的最好的事情是检查编译器文档以检查是否有可能根据格式字符串检查参数,这可以通过 MSVC、C for AIX 和DEC(/HP/Compaq) C.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多