如何正确声明接收函数指针的函数原型及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
相关产品推荐
相关产品推荐

