c - 函数的可变参数中是否需要 va_start?

标签 c variadic-functions variadic-macros

我正在阅读《Linux 编程接口(interface)》一文,他们展示了这个函数来处理错误。在手册页( man stdarg )中显示 va_start必须首先调用来初始化 apva_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 */
}

最佳答案

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

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

关于c - 函数的可变参数中是否需要 va_start?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703657/

相关文章:

基于for循环增量的函数指针的C宏扩展

c++ - Variadic 模板包装函数调用

为许多小的、固定大小的 block 自定义 malloc?

c - 为什么 printf 转换大数?

python 可变参数在函数名之前?

c++ - 在可变参数中转换特定类型

java - Spring AOP 切入点不适用于可变参数

使用可变宏进行 C 日志记录

c - 迭代直到在 C 中按下一个键

c - 在C中显示字母数和小数位数