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

gct*_*gct 25 c++ variadic-functions

可能重复:
C编程:转发变量参数列表.

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

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

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

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

Joh*_*ing 30

你不能转发变量参数列表,因为没有办法表达...作为另一个函数的参数下面的内容.

然而,你可以建立一个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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我在这里看不到任何不合标准的东西. (3认同)
  • 不。不属于C89(因此不属于C ++)的`stdarg.h`(或`cstdarg`)中唯一的东西是C99中添加的`va_copy`。 (2认同)

Chr*_*cke 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);
}
Run Code Online (Sandbox Code Playgroud)

基本上,每当你编写一个带有...的函数时,你应该编写另一个带有va_list的函数 - 如果你想启用这种类型的链接调用,这是一件很有礼貌的事情.


Nik*_*sov 6

这就是你拥有这一vprintf系列功能的原因.