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

如何正确声明接收函数指针的函数原型及main内的函数指针?

实现方案

核心问题说明

C语言不支持直接声明接收自身类型作为参数的函数指针,需要通过typedef先定义类型别名解决自引用的问题。如果需要在start函数内修改外部的state指针变量的指向,必须传入指针的地址,否则形参修改不会生效。

版本1:仅传指针值,无需修改外部state变量

函数原型声明

// 前置定义函数指针类型,指向的函数接收一个同类型的函数指针作为参数
typedef void (*StateFunc)(StateFunc);
// start函数原型
void start(StateFunc current);

main中函数指针声明与调用

int main(void) {
    StateFunc state = start;
    // 调用格式和你预期的完全一致
    state(state);
    return 0;
}

版本2:支持在start中修改外部state指针的指向

如果需要修改外部state变量的指向(比如状态机切换状态的场景),需要将参数改为指向函数指针的指针:

函数原型声明

typedef void (*StateFunc)(StateFunc*);
void start(StateFunc* current_state);

完整可运行示例

#include <stdio.h>

typedef void (*StateFunc)(StateFunc*);

// 示例:切换后的目标状态函数
void running_state(StateFunc* current) {
    printf("当前进入running状态\n");
    // 可继续修改*current切换到其他状态
}

void start(StateFunc* current) {
    printf("当前进入start状态\n");
    // 修改外部state指针的指向,完成状态切换
    *current = running_state;
}

int main(void) {
    StateFunc state = start;
    
    // 第一次调用,执行start逻辑,切换state指向
    state(&state);
    // 第二次调用,执行running_state逻辑
    state(&state);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者ADBeveridge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:18:00