【问题标题】:Can va_lists in stdarg.h handle C++ references?stdarg.h 中的 va_lists 可以处理 C++ 引用吗?
【发布时间】:2020-11-08 20:57:59
【问题描述】:

va_lists 可以处理 C++ 引用吗?我知道他们可以处理整数、双精度和指针,但不能处理浮点数、字符等。他们可以处理 C++ 引用吗?

【问题讨论】:

  • 不是浮点数、字符等?你能提供一个参考吗?我不知道va_list,你说的我很惊讶。我快速检查但没有找到类似的东西
  • 我猜他们的意思是,当float 类型的表达式作为参数提供给可变参数函数时,它会转换为double,因此被调用的函数必须使用va_arg(ap, double)va_arg(ap, float) 通常不起作用。同样char 被转换为intunsigned int
  • 该视频是关于 C 中的可变参数函数的。您的问题是关于 C++ 的。此外,C++ 标头是 cstadarg 而不是 stdarg.h。不要仅仅因为 C++ 试图相似就将 C 和 C++ 混淆为相同
  • @Serket Youtube 视频绝不是任何编程的答案。请提供指向文档的链接,或标准的引用来说明这一点。
  • 当你使用 C++ 时,你应该看看variadic templates/parameter packs。这可能是一个更好的选择。

标签: c++ function parameters variadic-functions variadic


【解决方案1】:

你应该#include <cstdarg> 而不是<stdarg.h>...

如果调用者将引用作为参数提供给此类函数,则调用的工作方式与直接指定引用对象的方式相同。例如,如果您有:

void f(...);
T my_t;
T& x = my_t;
f(my_t);
f(x);

在寄存器和/或堆栈中作为f 的参数传递的值在两次调用中将相同(假设外联调用,如果内联则功能等效)。

所以,“他们可以处理 C++ 引用吗?” - 是的,按照上面描述的方式,这可能是也可能不是您想要/期望的。


请注意:如果您有...

f(A& b, ...);

...行为未定义,因为 va_start 宏不支持将最终的 pre-...-matching 参数作为引用(您也不能传递 lambda 捕获或打包扩展)。请参阅 C++ 标准 [cstdarg.syn] 第 1 段了解完整详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多