使用 va_copy 有啥意义?
Posted
技术标签:
【中文标题】使用 va_copy 有啥意义?【英文标题】:What is the point of using va_copy?使用 va_copy 有什么意义? 【发布时间】:2020-03-06 14:06:34 【问题描述】:我阅读了一些关于 C/C++ 中的可变参数函数的信息,我发现了一个 thread,其中提到要在 GCC 中重用 va_list,您需要将它的副本与 va_copy 一起使用,并且在他们建议使用定义它的同一线程上
#define va_copy(d,s) ((d) = (s))
这意味着它只是将 va_list s 的值分配给 va_list d。
改用va_list ap1 = va_list ap
不是更易读吗?创建另一个名为 va_copy 的函数有什么意义?
【问题讨论】:
该线程中建议将其定义为((d) = (s))
的答案确实 不 建议为 GCC 或一般情况下这样做。这是针对 MSVC 的特定建议。 C 标准定义了va_copy
和相关特性必须满足的某些属性,C 实现以不同的方式实现这些。在 MSVC 支持变量参数列表的方法中,((d) = (s))
可能会起作用。在其他情况下,它可能不会。
【参考方案1】:
在 GCC 中,您需要将其副本与 va_copy 一起使用,并且在他们建议使用的同一线程上定义它
#define va_copy(d,s) ((d) = (s))
这意味着它只是将 va_list s 的值分配给 va_list d。
那不是他们在另一个线程中所说的。他们在J Jorgenson answer 中声明:
当尝试在 GCC 上重用 va_list 时,必须使用 va_copy(),因为 GCC 实现会导致 va_list 被修改,导致指针在 v??printf() 函数使用后定位在最后一个参数之后。
这意味着如果你需要在 GCC 中制作副本,你需要使用va_copy
The answer 谈到将va_copy
实现为
关于 MSVC 中缺少 va_copy 的 previous question 提出了一些足够体面的建议,包括实现您自己的 va_copy 版本以在 MSVC 中使用:
#define va_copy(d,s) ((d) = (s))
正在谈论没有实现va_copy
的MSVC。添加这样一个“无用”宏的原因是,您可以使用 va_copy
并在 GCC 和 MSVC 中获得正确的行为。
使用 va_list ap1 = va_list ap 不是更易读吗?创建另一个名为 va_copy 的函数有什么意义?
根据va_list
的实现方式,仅执行va_list ap1 = va_list ap
可能还不够。 operator =
可能无法完成一些需要发生的事情。例如,如果va_list
是一个指针类型,你不能为它重载operator =
,所以你需要创建一个命名的“函数”。
【讨论】:
虽然措辞可能没有暗示,但我知道这一点。我的疑问是为什么不简单地告诉大家使用va_list ap1 = ap
,它应该以更直观的方式做同样的事情。
@R3G3N3R4T0R 我已经添加到关于这个的答案中。
@R3G3N3R4T0R 因为您不能像在大多数编译器中那样复制va_list
,所以复制是实现定义的,并且这种分配是不可移植的。 va_copy()
更便携,除了 MSVC,恰好支持这种直接赋值以上是关于使用 va_copy 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章