将va_list转换为变量参数?

时间:2014-07-24 07:03:56

标签: c variadic-functions

我有一个函数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)。

1 个答案:

答案 0 :(得分:4)

不,没有办法将va_list变回参数列表。

通常的方法是定义一个以va_list为参数的基函数。例如,标准C库定义printfvprintf;第一个是varargs函数,第二个函数具有完全相同的功能,但需要va_list。同样,它定义了fprintfvfprintf。根据{{​​1}}来定义printfvprintffprintf是微不足道的:

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种类。)

我建议您采用类似的策略。