C++学习笔记(四)--指针(2)转
2012-04-02 20:50
344 查看
分类: C++学习笔记 2010-04-03 14:11 283人阅读 评论(0) 收藏 举报
回调函数和函数指针
最近在看代码,写代码的人很喜欢用回调函数和函数指针。一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。
什么是回调函数
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
为什么要使用回调函数
因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。
如何使用回调函数
使用回调函数,我们需要做三件事:
· 声明
· 定义
· 设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统不要把它当作你的某个类的成员函数。Opijn ipoj ipo
回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。
函数指针的声明
对回调函数有了一个初步的了解,下面我们来说一下函数指针。因为要实现回调,必须首先定义函数指针。
void (*) ()
左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数
为函数指针声明类型定义:
Typedef void(* pfv)()
pfv 是一个函数指针,它指向的函数没有输入参数,返回类型为void。使用这个类型定义名称可以隐藏负责的函数指针语法。
void (*p)();
void func()
{
……
}
p = func;
p的赋值可以不同,但一定要是函数的指针,并且参数和返回类型相同。
例如:
现学现卖的一个小例子
#include <iostream>
using namespace std;
typedef void (*PF)();
void func()
{
cout << "func" << endl;
}
void caller( PF pf)
{
pf();
}
int main()
{
PF p = func;
caller(p);
system("pause");
return 0;
}
调用约定
在visual c++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示调用规范(默认为_cdecl)。调用规范影响编译器产生的给定函数名,参数传递的顺序,堆栈清理责任以及参数传递机制。
不过,在win32的程序中,我见得比较多的是CALLBACK,这个宏定义在windef.h中,
#define CALLBACK __stdcall
它约定了函数在它们返回到调用者之前,都会从堆栈中移除掉参数。
回调函数和函数指针
最近在看代码,写代码的人很喜欢用回调函数和函数指针。一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。
什么是回调函数
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
为什么要使用回调函数
因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。
如何使用回调函数
使用回调函数,我们需要做三件事:
· 声明
· 定义
· 设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统不要把它当作你的某个类的成员函数。Opijn ipoj ipo
回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。
函数指针的声明
对回调函数有了一个初步的了解,下面我们来说一下函数指针。因为要实现回调,必须首先定义函数指针。
void (*) ()
左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数
为函数指针声明类型定义:
Typedef void(* pfv)()
pfv 是一个函数指针,它指向的函数没有输入参数,返回类型为void。使用这个类型定义名称可以隐藏负责的函数指针语法。
void (*p)();
void func()
{
……
}
p = func;
p的赋值可以不同,但一定要是函数的指针,并且参数和返回类型相同。
例如:
现学现卖的一个小例子
#include <iostream>
using namespace std;
typedef void (*PF)();
void func()
{
cout << "func" << endl;
}
void caller( PF pf)
{
pf();
}
int main()
{
PF p = func;
caller(p);
system("pause");
return 0;
}
调用约定
在visual c++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示调用规范(默认为_cdecl)。调用规范影响编译器产生的给定函数名,参数传递的顺序,堆栈清理责任以及参数传递机制。
不过,在win32的程序中,我见得比较多的是CALLBACK,这个宏定义在windef.h中,
#define CALLBACK __stdcall
它约定了函数在它们返回到调用者之前,都会从堆栈中移除掉参数。
相关文章推荐
- c++入门学习笔记指针篇
- C/C++中关于地址、指针和引用变量的学习笔记(五) : 指针
- c++学习笔记(一):函数指针的使用
- 【C++】学习笔记三十八——函数指针
- c++ 学习笔记(47)-C++中两个类中互相包含对方对象的指针问题
- C++学习笔记之八 复合类型---指针、数组和指针运算
- c++入门学习笔记指针篇
- c++ 11学习笔记--智能指针
- C++基础学习笔记---指针
- C++学习笔记(1)void*指针
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- C++学习笔记(第六章 指针的应用 字符串 引用 之二)
- 【C++】学习笔记草稿版系列9(指向类成员的指针)
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
- 【菜鸟C++学习笔记】20.常指针&指向常量的指针&指向常量的常指针
- C++学习之路指针记录笔记(一)
- c++ 模板学习笔记:类模板模拟auto_ptr智能指针(权哥)
- C++基础教程 学习笔记(二) 数组、字符串和指针
- C++学习笔记(四)--指针(1)