动态函数调用

时间:2014-03-09 10:40:45

标签: c function runtime

如何在C中编写运行时动态函数调用,这会在运行时使用可变数量的参数?

例如,考虑long sum(int count, ...);,它返回传递给它的(整数)参数值的总和。

$./a.out 1 2 3 4

10

$./a.out 1 2 3 4 -5

5

3 个答案:

答案 0 :(得分:1)

你不能。唉,你只能使用给定数量的参数调用可变参数函数,但不能用数组调用。

根据体系结构的不同,您可以将函数“后面”调用为“后面”函数 - 一个va_list的函数,只要有一个函数,例如vprintf()“后面的printf()long asum(int count, long * arr) { long s = 0; for (int i=0; i < count, i++) { s += arr[i]; } return s; } long vsum(int count, va_list ap) { long s = 0; for (int i=0; i < count, i++) { s += va_arg(ap, long); } return s; } long sum(int count, ...) { va_list ap; va_start(ap, count); long ret = vsum(count, ap); va_end(ap); return ret; } } - 使用数组的地址,但是高度不可移植的。最好不要这样做。

最好的方法是创建第三个函数,例如:

asum()

这个ssum()就是你要打的那个。但这仅适用于将命令行参数转换为。

的中间数组

也许额外的long ssum(int count, char ** arr) { long s = 0; for (int i=0; i < count, i++) { s += atol(arr[i]); // I am not sure if this is very portable; if not, choose another way. } return s; } 会有所帮助:

{{1}}

答案 1 :(得分:0)

main的签名是

int main(int argc, char *argv[])

然后,您可以访问程序时提供的参数。

解析那些。做数学。吐出答案

答案 2 :(得分:0)

是的,你可以!哦,堆栈溢出是如何充满了这样的nay-sayers。

看看这个图书馆:http://www.dyncall.org

您可以构建动态参数列表,然后执行任意函数。