va_copy()是否需要va_end()?

时间:2014-06-18 10:35:08

标签: c c99

在处理变量参数时,只需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);
}

1 个答案:

答案 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_startva_copy必须在返回之前附加va_end