在处理变量参数时,只需va_start()
需要匹配的va_end()
调用,或va_copy()
是否需要匹配的va_end()
,即
void foo(char *x, ...)
{
va_list l,c;
va_start(l,x);
va_copy(c,l);
---
va_end(c); //is this correct ?
va_end(l);
}
答案 0 :(得分:7)
是的,每个副本和原始副本都需要调用va_end()
。您的示例是正确的,va_end()
来电的顺序可以颠倒。
来自 ISO / IEC 9899:201x :
7.16.1.3 va_end宏
va_end宏有助于从其变量的函数正常返回 参数列表是通过扩展va_start宏或函数来引用的 包含va_copy宏的扩展,初始化了va_list ap。该 va_end宏可以修改ap以使其不再可用(不重新初始化) 通过va_start或va_copy宏)。如果没有相应的调用 va_start或va_copy宏,或者如果在之前没有调用va_end宏 返回,行为未定义。
最后一句话指出,每个va_start
或va_copy
必须在返回之前附加va_end
。