红联Linux门户
Linux帮助

Linux Callback

发布时间:2008-09-18 21:30:20来源:红联作者:joyrce
作者:zxuhong

回调函数是程序员不能显式地调用函数,儿时通过将回调函数的地址传给调用者从而实现函数调用。要实现回调,必须首先定义函数指针。

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 = func,ptr的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。如果赋给ptr不同的值(不同的函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样可以实现动态绑定。

下面看具体的回调函数的实例.

锟斤拷锟斤拷:
$ vi callback1.c

#include

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
#include

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

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
文章评论

共有 0 条评论