将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库定义了printf
和vprintf
; 第一个是varargs函数,第二个函数具有完全相同的function,但需要使用va_list
。 同样,它定义了fprintf
和vfprintf
。 根据printf
定义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
和varargs
。)
我建议你采取类似的策略。