返回函数指针的函数声明

5

在阅读这篇文章时,我遇到了下面的函数指针声明。我没有使用过这样的声明,但我的理解是:当对functionFactory进行解引用时,返回的值是一个接受两个整数并返回一个整数的函数。

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

我很好奇这种声明是针对这个案例而言的,还是我错过了一般性的方法。

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

<returnType> funcName(listOfArgs){}

这个似乎不在同一范畴内,能否有人详细解释一下呢?
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的函数,接收一个类型为int的参数,并返回FncPtr


addInt是什么? - WhyWhat

2

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

int function(int, int)

现在,通过插入*将其变为函数指针。由于优先级的影响(带括号的函数参数将比*更紧密地绑定到标识符),因此我们还需要插入括号:
int (*function)(int, int)

最后,用工厂函数的声明替换标识符。在这种情况下,我们将function替换为factory(int),其中包括参数列表。即:

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

这个声明了一个函数factory(int),它返回的东西适合放在int (*xxx)(int, int)中的xxx位置。适合在那个位置的是一个指向一个接受两个int并返回一个int的函数的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接