使用 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 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

使用 volatile long 有啥意义吗?

使用“while (true) ...”有啥意义?

使用嵌套迭代器有啥意义吗?

通过引用传递使用 const 有啥意义? C++ [重复]

使用标记化有啥意义?

使用“php artisan serve”命令运行 Laravel 有啥意义?