嵌入式技术
回调函数是个高级操作技巧,也是日常项目中常常使用到的技能。之所以说回调函数是个高级操作技巧,是因为它让异步操作更加方便,众所周知程序执行分为同步操作和异步操作,同步操作故名思意就是按代码顺序执行,而异步则是按需求进行回调执行,为了实时性一般回调要尽可能的快进快出,避免影响同步操作。下面简单学习一下回调函数的不同用法:
| 用法一
相信很多读者都听过注册回调,其实这是两个步骤的统称,先是对回调进行注册,再在特定的场景进行回调,一般会用在事件触发回调:
#include "stdio.h"
// 注册事件
void login_event(int event_type, void (*callback)(void))
{
printf("event %d login
", event_type);
if (callback != NULL)
{
callback();
}
}
// 回调处理
void callback_function()
{
printf("callback function handle
");
}
int main()
{
login_event(1, callback_function);
login_event(2, NULL);
return 0;
}
| 用法二
通过参数对事件参数化,简单理解就是通过输入参数,判断回调函数触发的事件:
#include "stdio.h"
void callback_handle(int state, int (*handle)(int))
{
handle(state);
}
int handle(int state)
{
switch (state)
{
case 0x00:
printf("state %d handle
", state);
break;
case 0x01:
printf("state %d handle
", state);
break;
case 0x02:
printf("state %d handle
", state);
break;
case 0x03:
printf("state %d handle
", state);
break;
default:
break;
}
}
int main()
{
callback_handle(0, handle);
callback_handle(1, handle);
return 0;
}
| 用法三
回调函数除了常规用法,还可以通过typedef关键字,把回调函数变成一种自定义类型的函数,这样就更方便使用:
#include "stdio.h"
typedef int (*callback_t)(int, int);
int callback_handle(int data1, int data2, callback_t callback)
{
int data = callback(data1, data2);
return data;
}
int sum_handle(int data1, int data2)
{
return (data1 + data2);
}
int minus_handle(int data1, int data2)
{
return (data1 - data2);
}
int main()
{
int user_data = 0;
user_data = callback_handle(1, 2, sum_handle);
printf("user_data:%d
", user_data);
user_data = callback_handle(2, 1, minus_handle);
printf("user_data:%d
", user_data);
return 0;
}
| 用法四
回调函数除了单个单独使用,还可以同类整合使用,这个同类是作者本人自认为的,通过把一些类似的函数整合在回调函数数组里:
#include "stdio.h"
typedef void (*callback_t)(int, int);
void add_handle(int a, int b)
{
printf("%d + %d = %d
", a, b, a + b);
}
void sub_handle(int a, int b)
{
printf("%d - %d = %d
", a, b, a - b);
}
int main()
{
callback_t callback[2] = {add_handle, sub_handle};
int size = sizeof(callback) / sizeof(callback_t);
for (int i = 0; i < size; i++)
{
callback[i](i, i + 1);
}
return 0;
}
| 高级技巧
众所周知C语言是面向过程的,但是也可以通过技巧来实现,这次通过回调函数来实现面向对象的多态,多态按字面的意思就是多种形态。多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数,下边的写法存在一定的不合理,只是为了展示实现方式:
#include "stdio.h"
typedef struct overall
{
void (*handle)(struct overall *);
} overall_t;
typedef struct
{
overall_t shape;
} section_1_t;
typedef struct
{
overall_t shape;
} section_2_t;
void section_1_handle(overall_t *shape)
{
printf("section_1_t handle
");
}
void section_2_handle(overall_t *shape)
{
printf("section_2_t handle
");
}
int main()
{
overall_t *overall = NULL;
section_1_t section_1 =
{
.shape = {section_1_handle},
};
section_2_t section_2 =
{
.shape = {section_2_handle},
};
overall = (overall_t *)§ion_1;
overall->handle(overall);
overall = (overall_t *)§ion_2;
overall->handle(overall);
return 0;
}
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !