回调函数与函数指针
来源:互联网 发布:淘宝卖家高信誉等级 编辑:程序博客网 时间:2024/06/05 06:11
回调函数与函数指针
用途
1、许多窗口就是通过回调函数来实现的,不同的按钮执行不同的函数
2、菜单处理
3、消息或事件机制也可以看作是一种回调机制
函数回调的实现方式
一般由函数指针实现,将函数的地址作为参数传递给调用他的函数,当函数执行到主调函数时,通过函数指针(即地址)找到被调用的函数,实现被调函数的功能,用函数回调的方式配合void *可以增加代码的通用性,只要函数指针所指向函数类型确定,就可以将同类型的函数的地址传递给主调函数,传递不同函数地址,用同一个主调函数实现不同的功能,可以通过以下代码来说明
#include <stdio.h>#include <math.h>//枚举类型声明typedef enum ERR1{DAYU,XIAOYU}ERR;//函数声明ERR F_Comp(const void *a, const void *b);ERR I_Comp(const void *a, const void *b);int GetResult(const void *a, const void *b, ERR (*Comp)(const void *n, const void *b));int main(){int a =9;int b = 2;float c = 89.0;float d = 38.0;GetResult((void *)(&c), (void *)(&b), I_Comp);//回调函数为整型比较函数printf("\n-------------------------------------------\n");GetResult((void *)&d, (void *)&c, F_Comp);//回调函数为浮点数比较函数printf("\n");return 0;}//函数的第三个参数为函数指针,传递回调函数的地址int GetResult(const void *a, const void *b, ERR (*Comp)(const void *n, const void *b)){//ERR err;Comp(a, b);//通过函数指针调用函数return 0;}//整型数的比较ERR I_Comp(const void *a, const void *b){if(*(int *)a > *(int *)b)//强制类型转换{printf("%d > %d\n", *(int *)a, *(int *)b);return DAYU;}else{printf("%d <= %d\n", *(int *)a, *(int *)b);return XIAOYU;}}//浮点数的比较ERR F_Comp(const void *a, const void *b){if(fabsf(*(float *)a - *(float *)b) > 0.00001){printf("%f > %f\n", *(float *)a, *(float*)b);return DAYU;}else{printf("%f <= %f\n", *(float *)a, *(float *)b);return XIAOYU;}}
主函数中给GetResult函数传递的函数地址分别为I_Comp、F_Comp,所以通过统一的函数GetResult获得了整型数和浮点数的比较结果
注意到GetResult函数参数都是void *型的,代表他可以接受任意类型的参数,而函数指针所指向函数的类型的参数接受的也是void *类型的参数,至于具体处理什么样的数据,则是由回调函数自己来定义的,I_Comp、F_Comp函数在函数体内部分别将void *型的数据强制转换成了整型指针和浮点型指针,明确了所要操作的数据类型,所以GetResult函数根本不关心回调函数是如何实现的,它只要知道回调函数的入口地址就可以了,不同的回调函数入口地址不同,自然实现的功能也就不同,但这样做统一了函数接口的
0 0
- 函数指针与回调函数
- 函数指针与软件设计--------回调函数
- 函数指针与回调函数
- 函数指针与软件设计--------回调函数
- 成员函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数基础
- 函数指针与回调函数
- 回调函数与函数指针
- C++ 回调函数与函数指针
- 函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数
- delphi 回调函数与函数指针
- 回调函数与函数指针
- C++函数指针与回调函数
- 函数指针与回调函数
- SSH隧道访问内网服务
- GCD 深入理解(一)
- EMC联邦帝国前世今生
- C++笔记——虚析构函数的使用场景
- leetcode笔记:Same Tree
- 回调函数与函数指针
- 读书笔记--python数据可视化--005_导出数据到JSON、CSV和EXcel
- session_unset()与session_destroy()
- 黑夜中的火柴之光
- 同余模定理
- 关于navicat导入excel的问题
- xListView上拉刷新下拉加载
- Qt学习 之 Socket通信
- 【看书】int的范围