如果我的理解是正确的va_end
被称为进行清理,并在同样的背景下,为va_end
手册页说,我们可以在不调用va_start的情况下调用va_end吗?
va_end用来()
的va_start的每次调用()必须由相应的 匹配在相同的函数中调用va_end()。在调用va_end(ap) 之后,变量ap是未定义的。列表的多次遍历,每个由va_start()和va_end()括起来的 都是可能的。 va_end()可能是一个 宏或函数。
所以这是va_end
需求明显,如果va_start
被称为被调用,但相反的关系成立,即应通过va_end
被va_start
之前始终?
我为你添加了[C]标记,因为'va_end'最初来自C。C++中的可变参数列表的使用非常有限(最好),因为它们不是类型安全的,类(构造函数等),并有更好的选择,例如可变模板。 –
简短的回答,没有。正如Michael Burr所说的那样,这是未定义的行为。有一些实现在va_start/va_end定义的底层使用malloc/free。 –