【问题标题】:Is va_start required in variadic arguments for functions?函数的可变参数中是否需要 va_start?
【发布时间】:2014-03-28 03:30:23
【问题描述】:

我正在阅读 Linux 编程接口文本,他们展示了这个函数来处理错误。在手册页 (man stdarg) 中,它说必须首先调用 va_start 来初始化 ap 以供 va_arg()va_end 使用。

那么为什么在这个函数中没有va_start

static void
outputError(Boolean useErr, int err, Boolean flushStdout,
        const char *format, va_list ap) 
{
#define BUF_SIZE 500
    char buf[BUF_SIZE], userMsg[BUF_SIZE], errText[BUF_SIZE];

    vsnprintf(userMsg, BUF_SIZE, format, ap);

    if (useErr)                                                                               
        snprintf(errText, BUF_SIZE, " [%s %s]",
                (err > 0 && err <= MAX_ENAME) ?
                ename[err] : "?UNKNOWN?", strerror(err));
    else
        snprintf(errText, BUF_SIZE, ":");

    snprintf(buf, BUF_SIZE, "ERROR%s %s\n", errText, userMsg);

    if (flushStdout)
        fflush(stdout);       /* Flush any pending stdout */
    fputs(buf, stderr);
    fflush(stderr);           /* In case stderr is not line-buffered */
}

【问题讨论】:

    标签: c variadic-functions variadic-macros


    【解决方案1】:

    va_list ap作为参数传递给函数outputError(),它必须在outputError()的调用者(或调用者的调用者等)中由va_start初始化。

    要回答您的主要问题,是的,va_start 是必需的,但不一定在使用 vp_list 的当前函数中。 va_end 也一样。

    【讨论】:

      【解决方案2】:

      那么为什么在这个函数中没有va_start

      这里是使用outputError()的地方之一:

      void
      errMsg(const char *format, ...)
      {
          va_list argList;
          int savedErrno;
          savedErrno = errno;
          /* In case we change it here */
          va_start(argList, format);
          outputError(TRUE, errno, TRUE, format, argList);
          va_end(argList);
          errno = savedErrno;
      }
      

      我认为这清楚地回答了您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多