C/C++回调函数简要介绍
来源:互联网 发布:景区票务系统源码 编辑:程序博客网 时间:2024/05/21 00:54
1、引子
在C/C++里面有个非常给力的库函数qsort,相信大家都用过。他的函数原型如下:
void qsort(void *base,size_tnmemb,size_tsize, int(*compar)(constvoid*, constvoid*));
使用的时候需要传递需要排序的数组base, 数组数目nmeb, 每个数组大小size,以及我们比较自定义的回调函数:compar.
2、概念
如compar所示,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
和回调函数相对,普通函数调用一般为同步调用,即A模块阻塞调用B模块函数,B模块执行完毕之后会讲结果返回给A模块。
回调函数则不同。A模块定义一个回调函数C,将函数指针C传给B模块作为参数。在调用B模块之后,B模块会根据一定的条件触发回调C,进而重新调用模块A的函数。
这样模块B就不用关心回调函数自己的具体实现,这样可以是系统架构更加清晰,可以提高系统的可扩展性。
3、举例
现在我们有个模块叫callback模块。callback模块会接受主函数main传来的a,b,回调函数c.
如果a==100,那么就返回10000,否则就使用我们的回调函数,执行c(a,b),并返回。
具体如下所示:
3.1、通用头文件 pub.h
这里主要定义了一个函数指针。
函数原型为 int myfoo(int, int);
如果有疑问,请自行Google or Baidu.
/*************************************************************************** * * Copyright (c) 2014 liujun&&baidu. inc All Rights Reserved * **************************************************************************//* * @filename: pub.h * @version: 1.0 * @date : 2014/01/28 14时44分05秒 * @author: liujun (liujun0923@zju.edu.cn) * @breif: */#ifndef PUB_INC#define PUB_INC#include<stdio.h>//定义一个回调函数,返回为int, 参数为int,inttypedef int(*myfoo)(int, int);#endif /* ----- #ifndef PUB_INC ----- */
3.2、callback模块
头文件callback.h: 主要定义了一个结构体,包括a,b,回调函数foo。同时有一个执行函数process.
/*************************************************************************** * * Copyright (c) 2014 liujun&&baidu. inc All Rights Reserved * **************************************************************************//* * @filename: callback.h * @version: 1.0 * @date : 2014/01/28 14时46分31秒 * @author: liujun (liujun0923@zju.edu.cn) * @breif: */#ifndef CALLBACK_INC#define CALLBACK_INC#include "pub.h"typedef struct _foo_struct_t{ int a; int b; myfoo foo;}foo_struct_t;int process(foo_struct_t* data);#endif /* ----- #ifndef CALLBACK_INC ----- */
执行函数callback.c: 如果a=100,那么返回10000,否则使用回调函数来执行
/*************************************************************************** * * Copyright (c) 2014 liujun&&baidu. inc All Rights Reserved * **************************************************************************//* * @filename: callback.c * @version: 1.0 * @date : 2014/01/28 14时48分26秒 * @author: liujun (liujun0923@zju.edu.cn) * @breif: */#include "callback.h"int process(foo_struct_t* data){int res;//这里你可以做很多事情。//这里你可以用主函数传来的函数指针来进行回调if( data->a == 100){res = 10000;}else{res = data->foo(data->a, data->b);}//你还是可以做很多事情return res;}
3.3、main模块
main.c: 从命令行接受参数a,b, 然后将a,b以及myfun函数地址一起参入模块callback。
/*************************************************************************** * * Copyright (c) 2014 liujun&&baidu. inc All Rights Reserved * **************************************************************************//* * @filename: main.c * @version: 1.0 * @date : 2014/01/28 14时52分48秒 * @author: liujun (liujun0923@zju.edu.cn) * @breif: */#include "pub.h"#include "callback.h"#include <stdlib.h>int myfun(int a, int b){ return a+b;}int main(int argc, char** argv){ foo_struct_t* data = (foo_struct_t*)malloc(sizeof(foo_struct_t)); data->a = atoi(argv[1]); data->b = atoi(argv[2]); data->foo = myfun; int res = process(data); printf("after callback is %d\n", res); return 0;}
3.4、Makefile
先生存libcallback,然后生成可执行文件。
main: main.c libcallbackgcc -g main.c -I. -L. -lcallback -o mainlibcallback:callback.h callback.c pub.hgcc -g -c callback.h callback.c pub.har -r libcallback.a callback.oclean:rm *.gchrm *.orm *.arm main
3.5、执行结果
liujun@ubuntu:~/test/callback$ ./main 100 200after callback is 10000liujun@ubuntu:~/test/callback$ ./main 50 200after callback is 250可以看到达到我们预期效果。
0 0
- C/C++回调函数简要介绍
- C/C++回调函数简要介绍
- C/C++回调函数简要介绍
- c/c++回调函数介绍
- C 回调函数
- 【c++】回调函数
- C 回调函数
- C回调函数
- [C] 回调函数
- C 回调函数
- C回调函数
- [C++]回调函数
- c/c++:回调函数
- C /C ++ 回调函数
- 简单介绍C语言中的回调函数
- 理解C回调函数
- C语言---回调函数
- c语言回调函数
- Chinese En/Decode for filesystem
- hashmap的内部实现机制
- NBUT 1537 Travel
- 编译并安装vim
- NO9.Java笔记【多线程】
- C/C++回调函数简要介绍
- android开发之多线程实现方法概述
- shell语法-函数
- vs2005字体设置的背景色的设置问题
- Java 设计模式 之 facade(外观)设计模式
- NSDictionary 判断空
- 正则表达式
- C++面试题(四)——智能指针的原理和实现
- Java 7之异步I/O第4篇 - 异步I/O操作之选择器