将va_list转换为变量参数?

我有一个函数log_message它需要变量参数。

 log_message(int level, char *fmt, ...) 

现在在调用this( log_message )函数之前我必须添加新函数( _log_message ),新函数将调用log_message

 _log_message(int level, char *fmt, ...) 

新function也一样。 当_log_message将调用log_message它会将变量输入转换为va_list 。 现在我有va_list ,我不想改变原来的那个,有没有办法改变回变量输入,所以我将能够调用原始的( log_message )。

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

通常的方法是定义一个以va_list为参数的基函数。 例如,标准C库定义了printfvprintf ; 第一个是varargs函数,第二个函数具有完全相同的function,但需要使用va_list 。 同样,它定义了fprintfvfprintf 。 根据printf定义printfvprintffprintfvfprintf

 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_listvarargs 。)

我建议你采取类似的策略。