我有这个:
long int addsquares(int n, ...)
如何访问参数?我不能使用va_start
并且va_arg
...
如果您说您有一个可变参数函数,并且不允许使用可变参数宏 ( va_xxx
),那么您必须自己重写这些宏的内容。
除非您可以更改函数原型,但我猜现在也允许这样做。
实施依赖...
预测试
long int addsquares(int n, int d1, ...){
printf("%p,%p\n", &n, &d1);
return 0L;
}
结果:windows 64bit 系统,vc10 (sizeof int:4)
003DFD54,003DFD58
windows 64 位系统,gcc 4.4.3 (sizeof int:4)
000000000022FE60,000000000022FE68
对于 vc10:
long int addsquares(int n, ...){
int i, *p = &n;
long sum = 0L;
for(i=1;i<=n;++i)
sum += p[i]*p[i];
return sum;
}
对于 gcc:
long int addsquares(int n, ...){
int i, *p = &n;
long sum = 0L;
for(i=1;i<=n;++i)
sum += p[i*2]*p[i*2];
return sum;
}
使用数组并将每个参数存储在数组的一个“单元格”中。
long int addsquares(int[] parameters)
{
for (int i = 0; i < parameters.length(); i++)
{
//Use current parameter: parameters[i]
}
}
这是 c# 代码,但我认为它也适用于 c。
查看此线程中的讨论... C 编译器如何实现具有可变数量参数的函数?
我想你会发现它会让你朝着正确的方向前进。特别注意关于需要使用其中一个论点作为一种手段来理清其他论点是什么以及在哪里的讨论。