【问题标题】:How can I process variable parameters (passed through ellipsis) using own custom functions (not vprintf etc)?如何使用自己的自定义函数(不是 vprintf 等)处理变量参数(通过省略号传递)?
【发布时间】:2014-09-09 21:26:49
【问题描述】:

我有兴趣在 C 语言中使用 function(specifier, ...); 风格的变量参数函数,用于其他目的,而不是花哨的打印或指定格式的读取。

示例可能包括自定义数据库列、将可变参数传递给可根据内容对其进行序列化的函数以及许多其他示例。

我知道基本用法:

char buffer[BUF_SIZE]
va_list args;
va_start(args, format);
vsnprintf(buffer, BUF_SIZE-1, format, args);
va_end(args);

这不是我要问的。

假设我想制作自己的 printf,它使用完全不同的格式,例如,它使用格式列表而不是格式字符串 - 指定类型的枚举数组,或其他方式来指定确切加载到... - 甚至 register_printf_function-> 都无法帮助我,出于某种原因,我不愿意尝试根据提供的数据构建格式字符串。

那么,我将如何从额外的省略号中访问数据(而不是将其盲目地传递给一个神奇的 vprintf 而不在其中窥视)?

【问题讨论】:

    标签: c variadic-functions


    【解决方案1】:

    你使用va_arg:

    va_list ap;
    va_start(ap, specifier);  // the argument before the ellipsis
    
    int i = va_arg(ap, int);  // extract an int argument
    double d = va_arg(ap, double);  // extract a double argument
    // etcetera.
    
    va_end(ap);  // cleanup
    

    Online example 展示了如何将 va_arg 与结构类型和终止标记一起使用。

    【讨论】:

    • 您能详细说明一下吗?例如如何迭代多个参数?我可以提前进行第 n 个参数吗?我是否仅限于原始类型,还是可以提取自定义结构等?
    • @SF。你一次读一个论点。官方对提取结构类型没有任何限制,尽管我不完全确定它的可移植性。
    【解决方案2】:

    只是指出,正如您在提供的示例中看到的那样,您一定会使用 va_arg 的静态类型:

    int i = va_arg(ap, int);
    

    当然,您可以对参数使用一些通用接口,然后从中推断出实际类型,但作为替代方案,您可以查看可变参数模板。 Here 是一篇很好的帖子,实际上是在谈论可变参数模板相对于 va_args 的好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多