关于ESP IDF中函数指针初始化方式的疑问
问题解析
先把你的几个误解拆解清楚:
先搞懂那个typedef的真实意思
typedef void *app_driver_handle_t;不是定义函数指针类型,只是把void*(无类型指针)起了个新名字app_driver_handle_t。这个类型本质就是个通用指针,用来当驱动的句柄——简单说就是驱动初始化后,返回一个指向内部状态结构体的指针,后续操作这个驱动都要靠这个句柄来识别。那两行是普通函数声明,不是函数指针
app_driver_handle_t app_driver_light_init(); app_driver_handle_t app_driver_button_init();
这俩是函数声明,告诉编译器:有这么两个函数,调用它们会返回一个app_driver_handle_t类型的值(也就是刚才说的驱动句柄)。比如调用app_driver_button_init(),就是初始化按键驱动,然后拿到这个驱动的句柄。
- 你写的代码是错的
你写的app_driver_handle_t = app_driver_button_init();不对,因为app_driver_handle_t是类型名,不是变量。正确的用法是先声明一个该类型的变量,再把函数返回值赋值给它:
// 声明一个句柄变量,然后把初始化函数的返回值赋给它 app_driver_handle_t button_handle = app_driver_button_init();
- 真·函数指针的写法是什么样的?
如果是定义函数指针类型,写法会是这样的:
// 定义一个指向"无参数、无返回值"函数的指针类型 typedef void (*app_driver_callback_t)(void);
对比一下就能看出和你看到的代码区别了。
内容的提问来源于stack exchange,提问作者Rafay Shams
相关产品推荐
相关产品推荐

