做电子画册的网站,零基础网站制作视频教程,网站收录做关键词排名,线上分销的三种模式C语言——回调函数 宗旨#xff1a;技术的学习是有限的#xff0c;分享的精神是无限的。 如果参数是一个函数指针#xff0c;调用者可以传递一个函数的地址给实现者#xff0c;让实现者去调用它#xff0c;这就是回调函数。
void func(void (*f)(void*), void *p)
提供…C语言——回调函数 宗旨技术的学习是有限的分享的精神是无限的。 如果参数是一个函数指针调用者可以传递一个函数的地址给实现者让实现者去调用它这就是回调函数。
void func(void (*f)(void*), void *p)
提供一个回调函数再提供一个准备传给回调函数的参数把回调函数传给参数f把准备传给回调函数的参数按void *类型传给参数p。在适当的时候根据调用者传来的函数指针f调用回调函数即调用f(p)。 首先使用typedef定义回调函数类型 (*event_cb_t)(const struct event *evt, void *userdata); 上面的语句表示event_cb_t类型函数范围值类型为void类型。 定义并实现一个函数用于注册回调函数 event_cb_register(event_cb_t cb, void *userdata); 下面是注册回调函数my_event_cb的一个模板 static void my_event_cb(const struct event *evt, void *data)
{ /* do stuff and things with the event */
} ... event_cb_register(my_event_cb, my_custom_data);
... 在事件调度器event dispatcher中常常将回调函数放在结构体中 struct event_cb
{ event_cb_t cb; void *data;
}; 此时通过访问结构体成员变量调用回调函数 struct event_cb *callback; ... /* Get the event_cb that you want to execute */ callback-cb(event, callback-data); 一个回调函数的例子 #include stdio.h struct event_cb; typedef void (*event_cb_t)(const struct event_cb *evt, void *user_data); struct event_cb
{ event_cb_t cb; void *data;
}; static struct event_cb saved { 0, 0 }; void event_cb_register(event_cb_t cb, void *user_data)
{ saved.cb cb; saved.data user_data;
} static void my_event_cb(const struct event_cb *evt, void *data)
{ printf(in %s\n, __func__); printf(data1: %s\n, (const char *)data); printf(data2: %s\n, (const char *)evt-data);
} int main(void)
{ char my_custom_data[40] Hello!; event_cb_register(my_event_cb, my_custom_data); saved.cb(saved, saved.data); return 0;
}