当我使用stdarg.h的va_list
,va_start
和va_end
来解决问题时,我正在寻找一种向函数传递无限数量参数的方法如给出here的程序所示。
但无法找到一种方法来访问以随机方式传递给函数的无限数量的参数。
使用stdarg.h头文件中的va_list
的方式是按顺序访问参数。一旦读出一个参数,就不会再回头了。
有没有办法随机访问这些参数?
编辑:我被建议发布代码而不是包含它的页面的链接。所以这就是:
#include <stdarg.h>
#include <stdio.h>
/* this function will take the number of values to average
followed by all of the numbers to average */
double average ( int num, ... )
{
va_list arguments;
double sum = 0;
/* Initializing arguments to store all values after num */
va_start ( arguments, num );
for ( int x = 0; x < num; x++ )
{
sum += va_arg ( arguments, double );
}
va_end ( arguments ); // Cleans up the list
return sum / num;
}
int main()
{
printf( "%f\n", average ( 3, 12.2, 22.3, 4.5 ) );
/* here it computes the average of the 5 values 3.3, 2.2, 1.1, 5.5 and 3.3
printf( "%f\n", average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) );
}
答案 0 :(得分:1)
没有便携的方法可以做到这一点。
假设您的函数使用三个参数调用,int
,double
和long double
。它们可能都有不同的尺寸。
va_arg
机制故意隐藏变量参数的基础布局,因为它可能因实现而异。
但是,让我们假设一个典型的实现可能会一个接一个地传递堆栈上的参数。你的函数无法知道第三个long double
参数在内存中的位置,而不知道前两个参数的大小。并且每个参数占用的空间量可能与该参数的大小不匹配;例如,为32位参数分配64位可能更方便。
<stdarg.h>
故意为访问变量参数提供了一个相当小的接口。它只允许您按顺序访问它们,并且只有在您知道每个参数的类型时才会访问它们。
如果你想做类似的事情,你可以写一个函数,它接受一个指针数组的初始元素的指针,每个指针指向一些数据结构可以容纳几种类型的任何一种类型(可能类似于tagged union)。但是调用者必须在调用函数之前设置该结构。
幸运的是,在实践中并没有太大的问题。我无法想到您需要随机访问参数的任何特定原因。
如果你想拥有任意数量的参数,这些参数都是相同类型的,那就是那些数组的用途。