// 定义回调函数类型
typedef void (*CallbackFunction)(void);
// 存储回调函数指针的变量
CallbackFunction callback;
// 注册回调函数
void register_callback(CallbackFunction func) {
callback = func;
}
// 模拟事件触发,调用回调函数
void event_occurred() {
if (callback!= NULL) {
callback();
}
}
// 回调函数定义
void my_callback() {
printf("回调函数被调用\n");
}
int main() {
register_callback(my_callback);
event_occurred();
return 0;
}
- 定义回调函数类型和相关变量
typedef void (*CallbackFunction)(void);
:这行代码定义了一个新的函数指针类型CallbackFunction
。这种类型的指针指向的函数没有参数且返回值为void
。这就像是为回调函数设定了一个“模板”,所有符合这个模板的函数都可以作为回调函数使用。CallbackFunction callback;
:声明了一个CallbackFunction
类型的变量callback
,这个变量用于存储我们注册的回调函数的地址。目前它还没有指向任何具体的函数。
- 实现注册回调函数的功能
void register_callback(CallbackFunction func)
:定义了一个名为register_callback
的函数,它接受一个CallbackFunction
类型的参数func
,也就是一个符合前面定义的回调函数模板的函数指针。callback = func;
:在register_callback
函数内部,将传入的回调函数指针func
赋值给全局变量callback
。这样,callback
就记住了我们想要注册的回调函数的地址,完成了回调函数的注册过程。
- 模拟事件触发并调用回调函数
void event_occurred()
:定义了一个函数event_occurred
,用于模拟某个事件的发生。if (callback!= NULL)
:在event_occurred
函数内部,首先检查callback
是否为空。如果callback
为空,说明还没有注册任何回调函数,就不执行任何操作。callback();
:如果callback
不为空,即已经注册了回调函数,就通过函数指针callback
调用对应的回调函数。这就相当于当事件发生时,执行我们预先注册好的回调函数的逻辑。
- 定义具体的回调函数并进行注册和触发
void my_callback()
:定义了一个具体的回调函数my_callback
,它符合CallbackFunction
类型的要求(无参数,返回值为void
)。在这个函数内部,只是简单地打印一条消息回调函数被调用
。- 在
main
函数中:register_callback(my_callback);
:调用register_callback
函数,将my_callback
函数的地址作为参数传入,完成回调函数的注册。此时,callback
变量就指向了my_callback
函数。event_occurred();
:调用event_occurred
函数,模拟事件发生。由于之前已经注册了my_callback
函数,event_occurred
函数会调用my_callback
,从而在控制台输出回调函数被调用
。
通过以上步骤,完整地展示了在C语言中注册回调函数以及触发调用回调函数的过程。