如何声明返回同类型函数指针的函数指针
递归式函数指针
funcPtr的声明方法 你的需求是声明一个函数指针,指向的函数接收两个int参数,并且返回和自身完全相同类型的函数指针——这是一种递归式的函数指针类型,在C语言里无法直接用简单的typedef定义,需要借助结构体来实现类型的递归引用。
正确的TYPE定义与funcPtr声明
我们可以通过结构体包装来实现这个递归类型:
// 先声明结构体类型,用于后续递归引用 typedef struct RecursiveFunc RecursiveFunc; // 定义结构体,内部包含一个函数指针:该函数接收两个int,返回RecursiveFunc指针 struct RecursiveFunc { RecursiveFunc* (*func)(int, int); }; // 这里的TYPE就是 RecursiveFunc* RecursiveFunc* funcPtr;
配合示例代码的使用方式
假设我们有两个符合要求的函数func1和func2:
// 实现func1:返回指向func2的结构体指针 RecursiveFunc* func1(int a, int b) { static RecursiveFunc func2_wrapper = {func2}; return &func2_wrapper; } // 实现func2:返回指向func1的结构体指针 RecursiveFunc* func2(int a, int b) { static RecursiveFunc func1_wrapper = {func1}; return &func1_wrapper; }
然后就可以按照你的示例代码逻辑使用:
// 初始化funcPtr为func1的返回值 funcPtr = func1(0, 1); // 调用funcPtr指向的函数,更新funcPtr为func2的返回值 funcPtr = funcPtr->func(2, 3);
如果想要直接调用funcPtr(无需->func)
如果希望funcPtr本身可以像普通函数指针一样直接调用(即funcPtr(0,1)),我们可以调整typedef,把结构体的函数指针作为我们的目标类型:
typedef struct RecursiveFunc RecursiveFunc; typedef RecursiveFunc* (*FuncPtr)(int, int); struct RecursiveFunc { FuncPtr func; }; // 现在TYPE就是FuncPtr FuncPtr funcPtr = (FuncPtr)func1;
不过这里需要注意:func1的实际类型是RecursiveFunc*(*)(int,int),和FuncPtr是兼容的,可以强制转换。调用时就可以直接写:
funcPtr = funcPtr(0, 1);
为什么不能直接用递归typedef?
C语言的标准不允许直接的递归typedef定义(比如typedef FuncPtr (*FuncPtr)(int, int);),因为在定义FuncPtr的时候,这个类型还没有完全声明完成,编译器会报错。结构体的方式通过先声明结构体类型,再在结构体内部引用它,绕开了这个限制。
内容的提问来源于stack exchange,提问作者Simon Bagley
相关产品推荐
相关产品推荐

