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开始,可以使用不同的模板函数来完成非常类似的行为。