gpt4 book ai didi

c - 在 C 中使用可变参数的示例

转载 作者:太空狗 更新时间:2023-10-29 16:21:23 24 4
gpt4 key购买 nike

Here我找到了一个如何在 C 中使用可变参数的示例。

#include <stdarg.h>

double average(int count, ...)
{
va_list ap;
int j;
double tot = 0;
va_start(ap, count); //Requires the last fixed parameter (to get the address)
for(j=0; j<count; j++)
tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
va_end(ap);
return tot/count;
}

我只能在一定程度上理解这个例子。

  1. 我不清楚为什么要使用 va_start(ap, count);。据我了解,通过这种方式我们将迭代器设置为其第一个元素。但是为什么默认不设置为开头呢?

  2. 我不清楚为什么我们需要将 count 作为参数。 C 不能自动确定参数的个数吗?

  3. 我不清楚为什么要使用 va_end(ap)。它改变了什么?它是否将迭代器设置到列表的末尾?但是它不是被循环设置到列表的末尾了吗?此外,我们为什么需要它?我们不再使用 ap;我们为什么要改变它?

最佳答案

请记住,参数是在堆栈上传递的。 va_start 函数包含用正确的堆栈指针初始化 va_list 的“神奇”代码。它必须传递给函数声明中最后命名的参数,否则它将不起作用。

va_arg 所做的是使用这个保存的堆栈指针,并为提供的类型提取正确数量的字节,然后修改 ap 使其指向下一个参数在堆栈上。


实际上这些函数(va_startva_argva_end)实际上并不是函数,而是作为预处理器宏实现的。实际的实现还取决于编译器,因为不同的编译器可能具有不同的堆栈布局以及将参数压入堆栈的方式。

关于c - 在 C 中使用可变参数的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15784729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com