4

在阅读本文时,我遇到了以下函数指针声明。我没有使用过这样的声明,但我解释它的方式是:取消引用时 functionFactory 的返回值是一个接受 2 个 int 并返回一个 int 的函数。

int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}

我很想知道这样的声明是否特定于这个案例,或者是否有我错过的通用方法。

我的意思是我们通常会看到像这样的声明

<returnType> funcName(listOfArgs){}

这个看起来不合群。有人可以详细说明。

4

2 回答 2

6

我们通常会看到像这样的声明 <returnType> funcName(listOfArgs){}

是的,但在这种情况下,返回类型是指向函数的指针,这实际上是定义这种函数的一种可能方法:

int (*functionFactory(int n))(int, int) {
    ...
}

幸运的是,您可以为任何类型创建别名,typedef这使得它变得更加简单:

typedef int (*FncPtr)(int,int);

FncPtr functionFactory(int n) {
    printf("Got parameter %d", n);
    FncPtr functionPtr = &addInt;
    return functionPtr;
}

这更容易阅读,也更容易理解。函数原型的形式就像你期望的那样:它是被调用的函数functionFactory,它接受 1 个类型的参数int并返回FncPtr:)

于 2013-03-26T18:02:46.607 回答
2

要声明返回指向函数的指针的函数,首先编写要返回的函数类型的声明。例如,接受两个int并返回一个的函数的类型int是:

int function(int, int)

现在,通过插入使其成为指向函数的指针*。由于优先级妨碍了(带括号的函数参数将比实际更紧密地绑定到标识符*),我们也必须插入括号:

int (*function)(int, int)

最后,将标识符替换为工厂函数的声明符。(为此,声明符是函数标识符和参数列表。)在这种情况下,我们替换functionfactory(int). 这给出了:

int (*factory(int))(int, int)

这声明了一个函数 ,它返回适合infactory(int)所在位置的东西。适合该位置的是指向一个函数的指针,该函数接受两个并返回一个.xxxint (*xxx)(int, int)intint

于 2013-03-26T18:04:08.680 回答