我想做的是以printf方式将数据发送到日志库(我无法修改)。
所以我想要一个像这样的函数:
void log_DEBUG(const char* fmt, ...) {
char buff[SOME_PROPER_LENGTH];
sprintf(buff, fmt, <varargs>);
log(DEBUG, buff);
}
我可以通过某种方式将varargs传递给另一个vararg函数吗?
答案 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 ++中。