我有一个函数log_message
它需要变量参数。
log_message(int level, char *fmt, ...)
现在在调用此(log_message
)函数之前,我必须添加新函数(_log_message
),新函数将调用log_message
。
_log_message(int level, char *fmt, ...)
新功能也一样。当_log_message
调用log_message
时,它会将变量输入转换为va_list
。现在我有va_list
,我不想改变原来的那个,有没有办法改回变量输入,所以我可以调用原始的(log_message
)。
答案 0 :(得分:4)
不,没有办法将va_list
变回参数列表。
通常的方法是定义一个以va_list
为参数的基函数。例如,标准C库定义printf
和vprintf
;第一个是varargs函数,第二个函数具有完全相同的功能,但需要va_list
。同样,它定义了fprintf
和vfprintf
。根据{{1}}来定义printf
,vprintf
和fprintf
是微不足道的:
vfprintf
(同样适用于各种int fprintf(FILE* stream, const char* format, ...) {
va_list ap;
va_start(ap, format);
int n = vfprintf(stream, format, ap);
va_end(ap);
return n;
}
int vprintf(const char* format, va_list ap) {
return vfprintf(stdout, format, ap);
}
int printf(const char* format, ...) {
va_list ap;
va_start(ap, format);
int n = vprintf(format, ap);
va_end(ap);
return n;
}
个函数,它们同时包含exec*
和va_list
种类。)
我建议您采用类似的策略。