gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:18:46 26 4
gpt4 key购买 nike

我正在阅读 The Linux Programming 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com