在开始时调用带有 va_list 参数的函数需要 va_start() 吗?

Căt*_*rbu 3 c c99 variadic-functions

具有以下标头的函数:

int max(int n, va_list vals)
Run Code Online (Sandbox Code Playgroud)

在函数内部调用:

int max_first(int n, ...)
Run Code Online (Sandbox Code Playgroud)

需要va_start(vals, n)在身体开始时调用吗?我试过没有,它有效,但我不明白哪种是正确的做法。

int max(int n, va_list vals)
{
    va_start(vals, n);
    // etc
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 5

问题是如果

int max(int n, va_list vals)
Run Code Online (Sandbox Code Playgroud)

在函数内部调用:

int max_first(int n, ...)
 
Run Code Online (Sandbox Code Playgroud)

需要va_start(vals, n)在身体开始时调用吗?

不,它不会也不能,正确的模式如下:

int max_first(int n, ...) {
    va_list vals;
    va_start(vals, n);
    int rv = max(n, vals);
    va_end(vals);
    return rv;
}
Run Code Online (Sandbox Code Playgroud)

然后

int max(int n, va_list vals) {
    for (int i = 0; i < n; i ++) {
        int val = va_arg(vals, int);
        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

即,您va_start只能在具有...并且需要在 之前传递参数的函数中...调用,并且每次调用后va_start必须始终遵循va_end相同的值,如果将其传递给函数,则必须在va_end之后立即调用不在调用函数中使用它;如果要再次处理参数,则必须再次调用va_start