在阅读this文章时,我遇到了以下函数指针声明。我没有使用过这样的声明,但我解释它的方式是:当取消引用时,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){}
这个出现在联盟之外。有人可以详细说明。
答案 0 :(得分: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
类型的1个参数并返回FncPtr
:)
答案 1 :(得分:2)
要声明一个返回指向函数的指针的函数,首先要写入要返回的函数类型的声明。例如,接受两个int
并返回int
的函数类型为:
int function(int, int)
现在,通过插入*
使其成为指向函数的指针。由于优先级妨碍了(带括号的函数参数将比*
更紧密地绑定到标识符),我们也必须插入括号:
int (*function)(int, int)
最后,用工厂函数的声明符替换标识符。 (为此,声明符是函数标识符和参数列表。)在这种情况下,我们将function
替换为factory(int)
。这给出了:
int (*factory(int))(int, int)
这声明了一个函数factory(int)
,它返回的内容适合xxx
int (*xxx)(int, int)
所在的位置。适合该点的是指向函数的指针,该函数占用两个int
并返回int
。