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

问题描述:

我的C有点生锈。假设我有以下几种:将函数数组作为参数传递给函数

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

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

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

但gcc抱怨。

参数具有相同的类型数组,但你可以省略尺寸:

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; 
} 
+2

+1但我也建议为函数指针typedef char *(* T)(void)'进行类型定义,因此它可以像普通数组写入:'T array [ ]'。 – user694733 2015-01-21 12:05:10

+0

@ user694733:好的,谢谢。我补充说。 – 2015-01-21 12:13:43