2013-06-28 48 views
3

如果我的理解是正确的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_endva_start之前始终?

+2

我为你添加了[C]标记,因为'va_end'最初来自C。C++中的可变参数列表的使用非常有限(最好),因为它们不是类型安全的,类(构造函数等),并有更好的选择,例如可变模板。 –

+0

简短的回答,没有。正如Michael Burr所说的那样,这是未定义的行为。有一些实现在va_start/va_end定义的底层使用malloc/free。 –

回答

5

从C99 7.15.1.3/2“的va_end宏”:

如果存在的va_start或va_copy宏没有相应的调用,或者如果va_end用来宏没有返回之前调用,行为未定义。

+1

这实际上回答了这些问题。 – Abhijit

2

不,另一种选择是va_copy()。他们都需要与va_end()配对。

在其他情况下,这样做没有意义。

+1

在其他情况下,行为未定义(通过省略)。 –

+0

我不确定我是否正确理解你的答案。你的意思是说'va_end'应该在'va_copy'之前,还是没有这样的限制,'va_end'可以单独调用。 – Abhijit

+3

这意味着'va_start()'需要'va_end()'而'va_copy()'需要'va_end()'。在其他情况下,你不需要它。使用它nevertheleass是a)无意义和b)可能调用UB(未定义的行为)。这意味着任何事情都可能发生(无所谓),数据损坏,程序终止异常。 – glglgl

相关问题