将 va_list 转换为可变参数?

Aru*_*pta 0 c variadic-functions

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

log_message(int level, char *fmt, ...)
Run Code Online (Sandbox Code Playgroud)

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

_log_message(int level, char *fmt, ...)
Run Code Online (Sandbox Code Playgroud)

新功能也一样。何时_log_message调用log_message它会将变量输入转换为va_list. 现在我有va_list,我不想改变原来的,有没有办法改回可变输入,所以我可以调用原来的(log_message)。

ric*_*ici 5

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

通常的方法是定义一个将 ava_list作为参数的基函数。例如,标准 C 库定义了printfvprintf;第一个是 varargs 函数,第二个具有完全相同的功能,但va_list取而代之。同样,它定义了fprintfvfprintf。定义printfvprintf 并且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;
}
Run Code Online (Sandbox Code Playgroud)

(类似地,对于各个exec*功能,进来都va_listvarargs品种。)

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

  • @Merom 仅仅是因为标准没有定义可靠的方法来做到这一点。调用期间的堆栈看起来完全不同。在通常的平台下,`...` 在堆栈上连续传递,而`va_list` 是一种指向这样一系列`...` 参数的指针。而且他们根本没有提供将它们放回堆栈的方法。 (2认同)