【问题标题】:Is it possible to write a varargs function that sends it argument list to another varargs function? [duplicate]是否可以编写一个可变参数函数,将其参数列表发送到另一个可变参数函数? [复制]
【发布时间】:2011-01-04 20:35:56
【问题描述】:

可能重复:
C Programming: Forward variable argument list.

我想做的是以 printf 的方式将数据发送到日志库(我无法修改)。

所以我想要一个类似这样的函数:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   sprintf(buff, fmt, <varargs>);
   log(DEBUG, buff);
}

我可以通过某种方式将可变参数传递给另一个可变参数函数吗?

【问题讨论】:

  • 我相信这不是重复的,因为 1719784 是关于 C 的,而这个问题是关于 C++ 的,其中使用可变参数模板函数可以实现这种构造。

标签: c++ variadic-functions


【解决方案1】:

您不能转发变量参数列表,因为无法将 ... 下面的内容作为参数表达给另一个函数。

但是,您可以从... 参数构建va_list 并将那个 发送到将正确格式化它的函数。这就是vsprintf 的用途。示例:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   va_list args;
   va_start(args, fmt);
   vsprintf(buff, fmt, args);
   va_end(args);
   log(DEBUG, buff);
}

【讨论】:

  • @Nikolai N Fetissov:谢谢,已修复。
  • 我在这里没有看到任何不标准的东西。
  • 我认为 va_list 本身就是非标准的。可能是错的。
  • 不。 stdarg.h(或 cstdarg)中唯一不属于 C89(因此也是 C++)的内容是 va_copy,它是在 C99 中添加的。
  • 这没有回答问题。或者至少,不像示例代码中显示的那样...... mysprintf 不是 sprintf 并且没有转发参数。我认为引用 vprintf 的其他答案更好。
【解决方案2】:

您可以将它发送到另一个以 va_list 作为参数的函数。没有其他办法,只能求助于手工制作的 asm,或者做一些可怕的猜谜游戏来计算参数的“数量”。

这可行:

void log_DEBUG(const char* fmt, ...)
{
  va_list va;
  va_start(va,fmt);
  char buff[blah];
  vsprintf(buff,fmt,va);
  log(DEBUG,buff);
  va_end(va);
}

基本上,每当您编写一个采用 ... 的函数时,您都应该编写另一个采用 va_list 的版本 - 如果您想启用这种类型的链接调用,这是礼貌的做法。

【讨论】:

  • 正是我需要的。我在想也许有办法直接传递 arg 列表,但是 vsprintf 会做得很好!
  • 接受的答案错过了“vsprintf”点,这就是为什么很多人(包括我)会用谷歌搜索这个答案。
【解决方案3】:

这就是您拥有vprintf 系列函数的原因。

【讨论】:

    【解决方案4】:

    对于您的具体要求,您可以使用vsprintf。我的 C/C++ 太生疏了,不记得在其他函数不是为它设计的情况下是否有一种直接的方法可以做到这一点(不会涉及丑陋的堆栈操作),但我倾向于不这么认为。

    【讨论】:

      【解决方案5】:

      不在标准 C++ 中。

      【讨论】:

      • 对,在 C++ 中最好使用&lt;&lt;
      • 不在标准 C 中,但从 C++11 开始,可以使用可变参数模板函数完成非常相似的行为。
      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多