我想编写一个返回类型为va_list的函数。
示例:va_list MyFunc(va_list args);
这是安全便携的吗?
答案 0 :(得分:7)
va_list
可能(但不保证)是数组类型,因此您无法按值传递或返回它。看起来像它的代码,可能只是传递/返回指向第一个元素的指针,因此您可以使用被调用者中的参数,但您可能会对原始元素执行操作。
正式地,您可以说va_list
是实体类型,而不是值类型。您可以使用va_copy
复制它,而不是使用赋值或通过函数参数/ return。
答案 1 :(得分:1)
虽然你绝对可以return
这样的值,但我不确定是否可以以有用的方式使用返回值。
由于处理va_list
需要特殊处理(va_end()
和va_start()
之后需要va_copy()
),以及va_start/copy
和va_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}修改原始列表。