我想编写一个返回类型为 va_list 的函数。
例子:va_list MyFunc(va_list args);
这个安全便携吗?
va_list
可能(但不保证)是数组类型,因此您不能按值传递或返回它。看起来好像是的代码可能只是传递/返回指向第一个元素的指针,因此您可以在被调用者中使用参数,但您可能正在对原始元素进行操作。
形式上你可能会说这va_list
是一个实体类型,而不是一个值类型。您使用 复制它va_copy
,而不是使用赋值或通过函数参数/返回。
虽然您绝对可以return
使用这样的值,但我不确定返回值是否可以以有用的方式使用。
由于va_list
s 的处理需要特殊处理(va_end()
需要在va_start()
and之后va_copy()
),并且甚至允许包含va_start/copy
and宏来强制执行这种配对,因此您不能在没有另一个的情况下调用一个。va_end
{ }
无论语言标准怎么说,这在实践中都不太可能奏效。Ava_list
很可能是指向调用者为了被调用者的利益而放置在堆栈上的调用记录的指针。一旦被调用者返回,堆栈上的内存就可以重用了。
返回类型va_list
不太可能将列表的内容实际复制回调用者。尽管这将是 C 的有效实现,但如果标准要求这样做,那将是规范中的缺陷。
但是,将指针传递给另一个函数与返回该指针完全不同。许多/大多数实现将实际变量参数存储在堆栈帧中,该堆栈帧在 vararg 函数返回时被销毁。(即返回一个 va_list 或指向一个的指针,将为您留下指向被破坏的局部变量的指针)。– 没有
好吧,在我的情况下,我会返回 va_list 但感谢您的警告 – Hayri Uğur Koltuk
如果将指向 a 的指针传递给va_list
function MyFunc(va_list *args)
,则无需将修改后的 (by va_arg(*args, type)
) 参数列表传回,因为MyFunc
会修改原始列表。