说我有函数foo_1(),foo_2(),... foo_n()
如何使用循环调用它们,也就是如何将字符串“转换”为函数调用:
for (i = 0; i < n; i++)
switch (fork()) {
case 0: //child process
*COMVAR+=m;
//call foo_i()
exit(4);
case -1:
exit(5);
}
答案 0 :(得分:6)
您不能让编译器或运行时在C中自动执行此操作,但是您可以手动列出函数指针并在循环中调用它们,即:
// create your function prototype, which all functions must use
typedef void(*VoidFunc)(void);
// create the array of pointers to actual functions
VoidFunc functions[] = { foo_1, foo_2, foo_3 };
// iterate the array and invoke them one by one
int main(void)
{
for (int i = 0; i < sizeof(functions) / sizeof(*functions); i++)
{
VoidFunc fn = functions[i];
fn();
}
return 0;
}
请记住,void func()
与C语言中的void func(void)
不同。
答案 1 :(得分:5)
不。
您能做的最好的事情就是包含一个函数指针数组
#include <stdio.h>
typedef int (*fx)(void); // fx is pointer to function taking no parameters and returning int
int foo_1(void) { printf("%s\n", __func__); return 1; }
int foo_2(void) { printf("%s\n", __func__); return 2; }
int foo_three(void) { printf("%s\n", __func__); return 3; }
int main(void) {
fx foo[3] = { foo_1, foo_2, foo_three };
for (int k = 0; k < 3; k++) {
printf("foo[%d]() returns %d\n", k, foo[k]());
}
}
答案 2 :(得分:0)
具有反射功能的高级语言(例如Java)可以执行此类操作,而C语言则不能。在Java中,您可以执行以下操作:
您有一个名为MyClass
public class MyClass {
public void myMethodName(String arg1);
}
您可以使用以下流程通过 String 表单来调用myMethodName
。
Class myObject = new MyClass();
Class<?> c = Class.forName("MyClass");
Class[] argTypes = new Class[] { String[].class };
Method method = c.getDeclaredMethod("myMethodName", argTypes);
method.invoke(myObject, params);
这是正式文件:https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html
答案 3 :(得分:0)
通常,您的方法在C语言中是不可能的。 但是您可以使用 switch 语句来实现。 尽管您必须编写一些代码。
switch (n)
{
case 1:
foo_1();
break;
case 2:
foo_2();
break;
case 3:
foo_3();
break;
.
.
.
case n:
foo_n();
break;
default:
// code to be executed if n doesn't match any constant
}