将va_list或指针传递给va_list?

R..*_*R.. 20 c

假设我有一个函数,它接受可变参数(...)或va_list从另一个这样的函数传递.主要逻辑是在这个函数本身(让我们调用它f1),但我想让它传递va_list给另一个函数(让我们调用它f2),它将确定下一个参数类型,使用它va_arg,并正确转换并存储它为呼叫者使用.

是否足以将va_list传递给f2,或者是否需要将指针传递给va_list.除非va_list需要是数组类型或者将其位置数据存储在va_list对象指向的位置(而不是在对象本身中),否则我无法看到如何通过值传递它可以允许调用函数(f1)为'看'被调用函数所做的更改va_arg.

任何人都可以阐明这一点吗?我对标准要求的内容感兴趣,而不是某些特定实现允许的内容.

Jer*_*myP 25

看起来你需要传递一个指向va_list的指针.有关详细信息,请参阅C99标准文档第7.15节.特别是,要点3指出:

对象ap可以作为参数传递给另一个函数; 如果该函数使用参数ap调用va_arg宏,则调用函数中的ap值是不确定的,并且应该在进一步引用ap之前传递给va_end宏.

[我的斜体]

编辑:刚刚注意到标准中的一个脚注:

215)允许创建指向va_list的指针并将该指针传递给另一个函数,在这种情况下,原始函数可以在其他函数返回后进一步使用原始列表

因此,您可以将指针传递给va_list,并va_arg(*va_list_pointer)在被调用的函数中执行.

  • 我会说留下评论和/或投票给他们 - 似乎更好的是让正确的答案没有与之前的错误假设混淆...... (2认同)