c/c++比较灵活的方法:回调函数和函数指针

当代码量比较小或者需求固定的时候,可以在一个函数里绑定另一个函数,实现函数互调。但当需要经常改变函数或需要实现动态调用时,绑定的参量就不能实现。这时候需要用到函数指针和函数回调

回调函数:回调函数是一个不显式调用的函数,通过将回调函数的地址传给调用者从而实现调用

函数指针:指向函数的指针,可以把函数指针传入另一个函数作为形参,实现回调,首先声明指针

void f();//这是一个函数原型,无输入,输出void型

void (*)()//左边圆括弧中的星号是函数指针声明的关键,另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数,注意还没有创建函数指针

unsigned psize = sizeof (void (*) ()); // 获得函数指针的大小

void (*p) (); //声明指针,p是指向函数的指针,该函数无输入,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值, 

void func()
{
        //do something
}
p = func; //
p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。

传递回调函数的地址给调用者:现在可以将p传递给另一个函数(调用者) caller(),它将调用p指向的函数,而此函数名是未知的:
void caller(void (*fnp) ())
{
        fnp();
}
void func();
int main()
{
      p = func; 
      caller(p); //传递函数地址到调用者
}
 
如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
值的内容是署名匹配的函数名和返回类型。例如:创
建指针变量,只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

#include <iostream>

int main()
{
    void caller(void (*) ()); //函数声明
    void func(); //函数声明
    void (*p) (); //定义指针变量
    p=func; //指针变量赋值
    caller(p); //回调
    getchar();
}  

//回调函数
void caller(void (*fnp) ())
{
    printf("调用成功");
    fnp();
}

//被调函数
void func()
{
    printf("回调成功");
}

这是比较简单的情况,大部分情况被调函数都有形参和返回值,回调函数也有返回值,但分析方法是相同的。

from 清水河畔

posted on 2010-12-17 18:35  MorningChen  阅读(8900)  评论(0编辑  收藏  举报

导航