可以传递在运行时输入的参数吗?

时间:2013-04-04 08:14:04

标签: c variadic-functions

在C语言中,我们可以使用变量函数,如:

void abc(int x, .. )
{
}

我们可以使用可变数量的参数调用它们,如:

abc(1,2,3) or abc(1,2,3,4,5)

但是,在上述两个函数调用中,我们使用我们已知的参数调用了可变参数函数abc;第一种情况下为“1,2,3”,第二种情况下为“1,2,3,4,5”。

我的问题是:

有没有办法在运行时调用用户输入的可变数量参数的可变参数函数?

例如,在main()中,我要求用户输入一定数量的输入,然后使用参数p1,p2,p3等将这些输入传递到可变参数函数中......

5 个答案:

答案 0 :(得分:1)

您可以使用数组,例如:

void abc(int size, int *arr) { }

主要

int size;
int A[MAX];

size = 3;
A[0] = 1; A[1] = 2; A[2]=3;
abc(size,A);

示例

int size=0;
int A[MAX]; 
while(size<MAX && scanf(" %d",&A[size])!=EOF) {
   size++;
}

 if(size>0) abc(size, A);

答案 1 :(得分:1)

实际上和理论上,尽管变通办法很可能发明这样的东西是不可取的......使用一些好的数据结构如linked list来存储任意数量的元素并在调用函数中传递头指针。 / p>

答案 2 :(得分:0)

不,这是不可能的。
编译器需要在编译期间为标识符生成适当的代码并保留空间。您将尝试更改静态二进制文件,这是不可能的。这实际上是va_args存在的原因,能够传递未知数量的参数。

答案 3 :(得分:0)

看起来您应该将指针传递给数组。

void yourfunction(int *array, size_t len) {
    //Do what you want in your function
}

答案 4 :(得分:0)

你不能轻易做到这一点。 变量参数函数根据某个调用约定进行编译。 因此,任何动态模仿调用约定的尝试都不可移植。

如果你真的需要这样做的一个解决方案是使用libffi。 有一些支持调用variadic函数。

否则我同意其他使用大小作为参数的数组的解决方案。