是否有可能编写一个varargs函数将其参数列表发送到另一个varargs函数?

时间:2010-01-13 21:56:56

标签: c++ variadic-functions

  

可能重复:
  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);
}

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

5 个答案:

答案 0 :(得分:28)

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

但是,您可以从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);
}

答案 1 :(得分:13)

您可以将其发送到另一个以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的函数 - 如果你想启用这种类型的链接调用,它就是礼貌的事情。

答案 2 :(得分:6)

这就是您拥有vprintf系列功能的原因。

答案 3 :(得分:4)

根据您的具体要求,您可以使用vsprintf。我的C / C ++太生疏了,无法回想起当另一个函数不是为它而设计的时候有一个简单的方法(没有进入丑陋的堆栈操作),但我倾向于不这样做。

答案 4 :(得分:3)

不在标准C ++中。