注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 顺便给51cto做个广告
 帮助

Linux Callback


2008-09-18 14:55:27
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zxuhong.blog.51cto.com/368977/100187
 
Linux Callback
 
 
回调函数是程序员不能显式地调用函数,儿时通过将回调函数的地址传给调用者从而实现函数调用。要实现回调,必须首先定义函数指针。 

void fun()      // 函数原型 
该语句声明了一个函数,没有参数并返回void 

void (*funPtr) ()// 函数指针
该语句声明了一个函数指针,左边圆括弧中的星号是函数指针声明的关键,右边圆括号是函数的参数(这里不带参数),函数的返回类型void)。

typedef void (*FUNC) ()// 为函数指针声明类型定义 
该语句为函数指针声明类型定义,FUNC是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。 

回调函数的实现方式
void caller(void (*ptr)() ) 

    ptr();                         // 调用ptr指向的函数

void func()
{
    // do something
}
int main() 

    caller(func);   // 传递函数地址到调用者 ptr = func
 
void (*ptr) (); ptr是是指向某函数的指针,该函数无输入参数,返回类型是void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。
void caller(void (*ptr)()); 函数caller将调用ptr指向的函数,此函数名是未知的。
caller(func); 函数指针ptr = funcptr的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。如果赋给ptr不同的值(不同的函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样可以实现动态绑定。 
 
下面看具体的回调函数的实例.
 
$ vi callback1.c
 
#include <stdio.h>
 
int mycb(int a)
{
        printf("parameter = %d\n", a);
        return(0);
}
 
int callbackfn(int (*func)(int), int data)
{
        func(data);
        return(0);
}
 
int main(void)
{
        callbackfn(mycb, 111);
 
        return(0);
}
 
 
编译、运行
 
$ gcc callback1.c -o callback1
$ ./callback1
parameter = 111
 
 
上面的例子以整型作为函数的参数,下面的例子用结构体作为函数的参数。
 
$ vi callback2.c
 
#include <stdio.h>
#include <string.h>
 
struct person
{
        char name[20];
        int  age;
};
 
int mycb(struct person p1)
{
        printf("name = %s, age = %d\n", p1.name, p1.age);
        return(0);
}
 
int callbackfn(int (*func)(struct person ), struct person person1)
{
        func(person1);
        return(0);
}
 
int main(void)
{
        struct person one;
        strcpy(one.name, "hongdy");
        one.age = 30;
 
        callbackfn(mycb, one);
 
        return(0);
}
 
编译、运行
 
$ gcc callback2.c -o callback2
$ ./callback2
name = hongdy, age = 30
 
下面的例子定义了typedef int (*FUNC)(int ) 使用时直接使用FUNC 即可。
 
$ vi callback3.c
 
#include <stdio.h>
 
typedef int (*FUNC)(int );
 
int mycb(int a)
{
        printf("parameter = %d\n", a);
        return(0);
}
 
int callbackfn(FUNC func, int data)
{
        func(data);
        return(0);
}
 
int main(void)
{
        callbackfn(mycb, 111);
 
        return(0);
}
 
 
编译、运行
 
$ gcc callback3.c -o callback3
$ ./callback3
parameter = 111
 
 
 
 
 
 

本文出自 “zxuhong” 博客,请务必保留此出处http://zxuhong.blog.51cto.com/368977/100187



上一篇 Linux Daemon  下一篇 ASCII Table



    文章评论
 
2008-09-18 15:12:43
来看看。支持一下!

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: