我正在阅读《Linux 编程接口(interface)》一文,他们展示了这个函数来处理错误。在手册页( 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 */
}
最佳答案
va_list ap
作为参数传递给函数 outputError()
,它必须由 调用者中的
(或调用者的调用者等)。va_start
初始化outputError()
要回答您的主要问题,是的,va_start
是必需的,但不一定在使用 vp_list
的当前函数中。 va_end
也是如此。
关于c - 函数的可变参数中是否需要 va_start?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703657/