You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明返回同类型函数指针的函数指针

递归式函数指针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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:04