使用循环在C中调用“顺序”命名的函数

时间:2018-10-25 08:55:18

标签: c

说我有函数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);
   }

4 个答案:

答案 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]());
    }
}

see code running on ideone

答案 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
}