将函数数组作为参数传递给函数

时间:2015-01-21 11:48:11

标签: c

我的C有点生疏。假设我有以下

char* (*funcs[n])(void);

如何定义或声明另一个函数将此数组作为参数。我试过

void func(char* (*p)(void));

但是gcc抱怨道。

1 个答案:

答案 0 :(得分:4)

该参数与数组的类型相同,只是您可以省略大小:

void print(char* (*p[])(void)) { ... }

您还可以使用数组衰减为指针并声明:

的事实
void print(char* (**p)(void)) { ... }

这些功能签名是等效的。在函数中,使用以下任一方法调用函数:

char *a = (*p)();
char *b = (p[0])();

这些电话也是等同的。

但是,正如user694733在评论中指出的那样,通过为某个签名的函数设置typedef,一切都变得更容易了,例如:

typedef char *(*Charpfunc)(void);

然后您可以使用熟悉的数组和函数参数语法:

char *hello(void) { return "hello"; }
char *howdy(void) { return "howdy"; }
char *goodbye(void) { return "goodbye"; }

typedef char *(*Charpfunc)(void);

void print(Charpfunc *p)
{
    while (*p) {
        puts((*p)());
        p++;
    }
}

int main()
{
    Charpfunc funcs[] = {
        hello, howdy, goodbye, NULL
    };

    print(funcs);
    return 0;
}