Linux Callback
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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
= func,ptr的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。如果赋给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 本文出自 51CTO.COM技术博客 |


zxuhong
博客统计信息
热门文章
最新评论
友情链接