c语言实现注册多个回调函数列表
时间: 2023-10-16 08:06:36 浏览: 53
可以通过定义一个函数指针数组来实现注册多个回调函数列表。具体实现步骤如下:
1. 定义一个函数指针类型,用于指向回调函数。
```c
typedef void (*CallbackFunc)(void);
```
2. 定义一个结构体,包含函数指针数组和当前已注册的回调函数数量。
```c
typedef struct {
CallbackFunc callbacks[MAX_CALLBACKS];
int count;
} CallbackList;
```
其中,MAX_CALLBACKS 表示最大回调函数数量,可以根据需要自行定义。
3. 定义注册回调函数的函数,将回调函数添加到指定的回调函数列表中。
```c
void register_callback(CallbackList *list, CallbackFunc callback) {
if (list->count < MAX_CALLBACKS) {
list->callbacks[list->count++] = callback;
} else {
printf("Callback list is full.\n");
}
}
```
其中,list 表示回调函数列表的指针,callback 表示要注册的回调函数。
4. 定义执行回调函数的函数,遍历回调函数列表,依次调用注册的回调函数。
```c
void call_callbacks(CallbackList *list) {
for (int i = 0; i < list->count; i++) {
list->callbacks[i]();
}
}
```
其中,list 表示回调函数列表的指针。
下面是一个完整的示例代码:
```c
#include <stdio.h>
#define MAX_CALLBACKS 10
typedef void (*CallbackFunc)(void);
typedef struct {
CallbackFunc callbacks[MAX_CALLBACKS];
int count;
} CallbackList;
void register_callback(CallbackList *list, CallbackFunc callback) {
if (list->count < MAX_CALLBACKS) {
list->callbacks[list->count++] = callback;
} else {
printf("Callback list is full.\n");
}
}
void call_callbacks(CallbackList *list) {
for (int i = 0; i < list->count; i++) {
list->callbacks[i]();
}
}
void callback1(void) {
printf("Callback 1\n");
}
void callback2(void) {
printf("Callback 2\n");
}
int main() {
CallbackList list;
list.count = 0;
register_callback(&list, callback1);
register_callback(&list, callback2);
call_callbacks(&list);
return 0;
}
```
输出结果为:
```
Callback 1
Callback 2
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)