【问题标题】:what's the difference between the printf and vprintf function families, and when should I use one over the other?printf 和 vprintf 函数系列之间有什么区别,我应该什么时候使用一个而不是另一个?
【发布时间】:2009-09-28 07:14:13
【问题描述】:

我了解printffprintfsprintf 等函数与vprintfvfprintfvsprintf 等函数之间的区别与它们处理函数参数的方式有关。但具体如何?真的有理由使用其中一个吗?我应该总是使用printf,因为这是在C 中更常见的东西,还是有正当理由选择vprintf

【问题讨论】:

  • 我建议在您的问题中添加标签“printf”和“variadic-functions”。

标签: c


【解决方案1】:

printf()和朋友们正常使用。 vprintf() 和朋友在您想编写自己的 printf() 类函数时使用。假设你想写一个函数来打印错误:

int error(char *fmt, ...)
{
    int result;
    va_list args;
    va_start(args, fmt);
    // what here?
    va_end(args);
    return result;
}

您会注意到您不能将args 传递给printf(),因为printf() 接受许多参数,而不是一个va_list 参数。然而,vprintf() 函数确实采用va_list 参数而不是可变数量的参数,所以这里是完整的版本:

int error(char *fmt, ...)
{
    int result;
    va_list args;
    va_start(args, fmt);
    fputs("Error: ", stderr);
    result = vfprintf(stderr, fmt, args);
    va_end(args);
    return result;
}

【讨论】:

  • 当然,然后你想要一个 warn() 函数,它的工作方式类似于 error(),但会打印“警告:”,所以你创建你的 own vprintf() 样式函数:int verror(char *prefix, char *fmt, va_list args); 并让error() 用“错误:”调用它,warn() 用“警告:”调用它,但这都是语义。
  • 是时候学习可变参数函数了!这个答案解决了问题,谢谢。
  • 注意:“v”代表“可变参数”。知道这有助于我记住 vprintf 函数是什么,因为提醒自己“v”代表什么也提醒我这些函数的用途。更多关于“可变参数”的信息:en.wikipedia.org/wiki/Variadic_function.
【解决方案2】:

你永远不想直接使用vprintf(),但是当你需要时它非常方便,例如包装printf()。对于这些情况,您将使用可变参数 (...) 定义顶级函数。然后您将这些信息收集到va_list,进行处理,最后在va_list 上调用vprintf() 以进行打印。

【讨论】:

  • 永不言败。
【解决方案3】:

可变参数的主要困难不是参数的数量是可变的,而是每个参数都没有关联的名称。 va_start、va_arg 宏使用格式字符串 cf 中包含的类型信息解析内存中的参数(在大多数 C 编译器中它们位于堆栈上)。 Kernighan 和 Ritchie,第二版,第 7.3 节。

【讨论】:

    【解决方案4】:

    这个例子展示了 Python 的优雅。由于 C/C++ 无法调和int error(char *fmt, ...)int error(char *fmt, va_list ap) 之间的差异,因此,对于每个函数*printf,它必须创建两个版本,即一个接收...,另一个接收va_list,这实际上使函数总数增加了一倍。在 Python 中,您可以使用*list()**dict()va_list 作为... 传递。

    希望未来的 C/C++ 可以支持这种参数处理方案。

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多