Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以编写一个varargs函数,将其参数列表发送给另一个varargs函数?_C++_Variadic Functions - Fatal编程技术网

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

C++ 是否可以编写一个varargs函数,将其参数列表发送给另一个varargs函数?,c++,variadic-functions,C++,Variadic Functions,可能重复: 我想做的是以printf的方式将数据发送到日志库(我无法修改) 我想要一个类似这样的函数: void log_DEBUG(const char* fmt, ...) { char buff[SOME_PROPER_LENGTH]; sprintf(buff, fmt, <varargs>); log(DEBUG, buff); } void log\u调试(常量字符*fmt,…){ char buff[一些适当的长度]; sprintf(buff,f

可能重复:

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

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

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   sprintf(buff, fmt, <varargs>);
   log(DEBUG, buff);
}
void log\u调试(常量字符*fmt,…){
char buff[一些适当的长度];
sprintf(buff,fmt,);
日志(调试,buff);
}

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

< P>不是标准C++。

< P>这就是为什么你有函数族。

< P>对于你的特定要求,你可以使用。我的C/C++太生疏了,当另一个函数不是为它设计的时,我想不起来是否有一种简单的方法来实现它(不需要进行丑陋的堆栈操作),但我倾向于不这样认为。

您可以将它发送到另一个以va列表为参数的函数。除了求助于手工制作的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_列表的版本-如果你想启用这种类型的链接调用,这是礼貌的做法。

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

但是,您可以从
..
参数中构建
va_列表
,并将其发送到一个函数,该函数将正确格式化它。这就是为什么。例如:

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);
}

Dupe:我相信这不是一个复制品,因为1719784是关于C的,这个问题是关于C++的,在那里,这种构造可以使用可变模板函数来实现。我在想也许有办法直接传递arg列表,但是vsprintf会做得很好!被接受的答案漏掉了“vsprintf”这一点,这就是为什么很多人(包括我)会用谷歌搜索这个答案。@Nikolai N Fetissov:谢谢,修正了。我在这里没有看到任何不标准的东西。我认为va_列表本身就是不标准的。可能是错的。
stdarg.h
(或
cstdarg
)中唯一不属于C89的部分(因此C++)是在C99中添加的
va_copy
。这并不能回答问题。或者至少,不像示例代码中显示的那样。。。mysprintf不是sprintf,参数也不会被转发。我认为VPRTFF的其他答案更好。对C++来说,最好使用<代码>而不是标准C,但是从C++ 11开始,可以使用不同的模板函数来完成非常类似的行为。