可能重复:
C 编程:前向变量参数列表。
我想做的是以 printf 的方式将数据发送到日志库(我无法修改)。
所以我想要一个这样的函数:
void log_DEBUG(const char* fmt, ...) {
char buff[SOME_PROPER_LENGTH];
sprintf(buff, fmt, <varargs>);
log(DEBUG, buff);
}
我可以以某种方式将可变参数传递给另一个可变参数函数吗?
可能重复:
C 编程:前向变量参数列表。
我想做的是以 printf 的方式将数据发送到日志库(我无法修改)。
所以我想要一个这样的函数:
void log_DEBUG(const char* fmt, ...) {
char buff[SOME_PROPER_LENGTH];
sprintf(buff, fmt, <varargs>);
log(DEBUG, buff);
}
我可以以某种方式将可变参数传递给另一个可变参数函数吗?
您不能转发变量参数列表,因为无法将下面的内容...
作为参数表达给另一个函数。
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);
}
您可以将它发送到另一个以 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 的版本——如果您想启用这种类型的链接调用,这是礼貌的做法。
这就是为什么你有vprintf
函数族。
对于您的特定要求,您可以使用vsprintf
. 我的 C/C++ 太生疏了,以至于当另一个函数不是为它设计时(不涉及丑陋的堆栈操作),是否有一种简单的方法可以做到这一点,但我倾向于不这么认为。
不在标准 C++ 中。