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

ary*_*naq 1 c

我的C有点生锈。假设我有以下内容

char* (*funcs[n])(void);
Run Code Online (Sandbox Code Playgroud)

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

void func(char* (*p)(void));
Run Code Online (Sandbox Code Playgroud)

但是海湾合作委员会抱怨。

M O*_*ehm 5

该参数与数组具有相同的类型,但可以省略大小:

void print(char* (*p[])(void)) { ... }
Run Code Online (Sandbox Code Playgroud)

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

void print(char* (**p)(void)) { ... }
Run Code Online (Sandbox Code Playgroud)

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

char *a = (*p)();
char *b = (p[0])();
Run Code Online (Sandbox Code Playgroud)

这些调用也是等效的。

但是,正如user694733在评论中指出的那样,通过使typedef具有特定签名的for函数使一切变得更容易,例如:

typedef char *(*Charpfunc)(void);
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • +1但我也建议为函数指针`typedef char *(* T)(void)`进行类型定义,因此可以像普通数组那样写:T array []。 (2认同)