在处理变量参数时,是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);
}
发布于 2014-06-18 02:36:11
是的,每一份副本和原件都需要调用va_end()
。您的例子是正确的,您的va_end()
调用的顺序可以颠倒。
调自ISO/IEC 9899:201x
7.16.1.3 va_end宏 va_end宏可以从函数中正常返回,该函数的变量参数列表被初始化va_start宏的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
。
https://stackoverflow.com/questions/24283346
复制