为何返回函数指针的C语言函数定义需采用特定写法?
为什么返回函数指针的C函数不能写成
int (*)(int, int) functionFactory(int n)? C语言的声明逻辑是声明跟着用法走——怎么用这个标识符,就怎么写它的声明。
先看正确的声明写法:int ( * functionFactory (int n) ) (int, int)
你实际调用这个函数时,写法是(*functionFactory(10))(20,30),这个表达式最终会得到一个int值。对应到声明里:
functionFactory(int n)是函数调用,返回的是一个指针- 给这个指针加
*解引用后,得到的是一个能接收两个int参数、返回int的函数 - 整个表达式的结果类型是开头的
int,完全匹配使用逻辑。
那为啥不能把返回类型int (*)(int, int)直接放开头?
因为C的语法解析不认这种写法。编译器会把开头的int (*)(int, int)当成一个变量类型,误以为functionFactory是个这种类型的变量,而不是返回该类型的函数——C要求函数声明里,函数名必须直接跟在参数列表前面,明确告诉编译器“这是个函数”,而不是混在指针类型里让编译器猜。
如果觉得原写法太绕,用typedef简化是合法的,比如:
typedef int (*FuncPtr)(int, int); FuncPtr functionFactory(int n) { // 函数体 }
这里FuncPtr是我们定义的函数指针类型别名,编译器能清晰识别functionFactory是返回FuncPtr类型的函数,写法就和普通函数一致了。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

