【问题标题】:Accessing variadic function arguments without stdarg在没有 stdarg 的情况下访问可变参数函数参数
【发布时间】:2014-06-11 22:14:52
【问题描述】:

有没有办法使用指针访问函数中的可变参数?我尝试做类似的事情

void test(int p, ...)
{
    int firstarg = *(&p - 1);
}

但这不起作用。

va_start 和 va_arg 如何访问这些参数?

【问题讨论】:

标签: c pointers variadic-functions


【解决方案1】:

没有可移植的方法可以做到这一点——也没有充分的理由使用任何不可移植的方法(除非您实际上是为新系统编写<stdarg.h>)。

<stdarg.h> 中定义的宏必须以某种方式实现。您可以检查该标头的内容为您的实现,并可能重现它们所做的 - 但结果可能不适用于其他系统。

如果您想知道va_startva_arg 是如何在您的系统上实现的,您可以使用一个使用它们的程序并在预处理器阶段运行它。如果你使用 gcc,那么gcc -E 会这样做。但在某些系统上,它们可能是根据特定于编译器的扩展来实现的,因此结果可能不会告诉你太多。

好奇心很好,但在这种特殊情况下,您真正​​需要知道的是<stdarg.h> 中定义的宏按指定工作。

【讨论】:

  • 宏被扩展为__builtin_va_start(argptr, p);——不是很有启发性。我猜这意味着它是作为编译器扩展实现的?
【解决方案2】:

如果没有 <stdarg.h> 标头,您将无法访问可变函数参数。

标准库的这一部分属于“语言支持”类别,即它包含您需要的库功能,以便利用某些语言功能。

【讨论】:

  • 除了stdarg是怎么实现的?肯定可以做一些类似于 stdarg 的事情。
  • @user2612743:不。标准库的实现通常不关你的事。你可以查一下,但它没有任何用处,因为它不会让你写出更好的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2023-03-30
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多