回调函数与指针
来源:互联网 发布:网络金庸群侠传 编辑:程序博客网 时间:2024/05/16 12:30
声明函数指针
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:
void f();// 函数原型
上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:
void (*) ();
让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:
// 获得函数指针的大小
unsigned psize = sizeof (void (*) ());
// 为函数指针声明类型定义
typedef void (*pfv) ();
pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。
指针变量应该有一个变量名:
void (*p) (); //p是指向某函数的指针
p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。
调用规范
到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。
将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:
// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int);
// 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int));
// 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错
指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。
---------------------------------------------------------------------------------------------------------------
为什么要用回调呢?
比如我要写一个子模块给你用, 来接收远程socket发来的命令.当我接收到命令后, 需要调用你的主模块的函数, 来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令, 我也不知道你的主模块是什么.cpp或者.h, 或者说, 我根本不用关心你在主模块里怎么处理它, 也不应该关心用什么函数处理它...... 怎么办?
使用回调.
我在我的模块里先定义回调函数类型, 以及回调函数指针.
typedef void (CALLBACK *cbkSendCmdToMain) (AnsiString sCmd);
cbkSendCmdToMain SendCmdToMain;
这样SendCmdToMain就是一个指向拥有一个AnsiString形参, 返回值为void的函数指针.
这样, 在我接收到命令时, 就可以调用这个函数啦.
...
SendCmdToMain(sCommand);
...
- 回调函数与指针
- 函数指针与回调函数
- 函数指针与软件设计--------回调函数
- 函数指针与回调函数
- 函数指针与软件设计--------回调函数
- 成员函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数基础
- 函数指针与回调函数
- 回调函数与函数指针
- C++ 回调函数与函数指针
- 函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数
- 函数指针与回调函数
- delphi 回调函数与函数指针
- 回调函数与函数指针
- C++函数指针与回调函数
- Subsonic简单的语法整理
- {{jQuery源码分析}}jQuery对象初始化的多种传参数形式
- BI:Java调用Kettle执行任务或转换
- 数据库的连接——“OLEDB与ODBC”
- 如何使WORD自带公式编辑器按自动感应输入类型
- 回调函数与指针
- /r/n
- 浅谈 java 设计模式--策略模式(Strategy pattern)
- Ø集合操作
- 简单对话框、选项对话框和Toast『Android系列11』
- POJ 1222 解题报告
- 使用do 框架进行javascript无阻塞加载脚本
- Win7下telnet使用(附图)
- poj 1511 Invitation Cards