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)
问题是如果
Run Code Online (Sandbox Code Playgroud)int max(int n, va_list vals)在函数内部调用:
Run Code Online (Sandbox Code Playgroud)int max_first(int n, ...)需要
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。
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |