在C中返回va_list是否安全?

时间:2012-05-18 07:19:56

标签: c c99 c89 variadic-functions

我想编写一个返回类型为va_list的函数。

示例:va_list MyFunc(va_list args);

这是安全便携的吗?

4 个答案:

答案 0 :(得分:7)

va_list 可能(但不保证)是数组类型,因此您无法按值传递或返回它。看起来像它的代码,可能只是传递/返回指向第一个元素的指针,因此您可以使用被调用者中的参数,但您可能会对原始元素执行操作。

正式地,您可以说va_list是实体类型,而不是值类型。您可以使用va_copy复制它,而不是使用赋值或通过函数参数/ return。

答案 1 :(得分:1)

虽然你绝对可以return这样的值,但我不确定是否可以以有用的方式使用返回值。

由于处理va_list需要特殊处理(va_end()va_start()之后需要va_copy()),以及va_start/copyva_end宏甚至允许包含{ }来强制执行此配对,你不能在没有另一个的情况下调用它。

答案 2 :(得分:1)

无论语言标准如何,这在实践中都不太可行。 va_list可能是指向调用者放置在堆栈上的调用记录的指针,以便被调用者受益。一旦被调用者返回,堆栈上的内存就是公平游戏以供重用。

返回类型va_list不太可能实际将列表内容复制回调用者。虽然这将是C的有效实现,但如果标准要求这样做,那将是规范中的缺陷。

答案 3 :(得分:0)

  

将指针传递给另一个函数与完全不同   然后返回那个指针。许多/大多数实现都存储了   堆栈框架中的实际变量参数在被销毁时被销毁   vararg函数返回。 (即返回一个va_list或一个指向   一,将留给你指向局部变量的指针   破坏)。 - 不是

     

在我的情况下,我将返回va_list,但感谢警告 -   HayriUğurKoltuk

如果将va_list指针传递给函数MyFunc(va_list *args),则不需要传递修改后的(va_arg(*args, type))参数列表,因为{{1}修改原始列表。