一、typedef定义函数
除了函数指针,普通函数也可以用typedef,如:
typedef int F (void);//定义函数类型F
之后可以这样声明:
F f,g;
相当于声明
int f(void);
int g(void);
下面这个函数声明是错误的:
F h(void);
因为函数可以返回void 类型、标量类型、结构体、联合体,但不能返回函数类型,也不能返回数组类型。
而下面这个函数声明是正确的:
F *e(void);
函数e 返回一个F * 类型的函数指针。
如果给e 多套几层括号仍然表示同样的意思:
F *((e))(void);
但如果把* 号也套在括号里就不一样了:
int (*fp)(void);
这样声明了一个函数指针,而不是声明一个函数。fp 也可以这样声明:
F *fp;
二、回调函数
回调函数 如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这称为回调函数(Callback Function)。例如qsort(3) 和bsearch(3) 。 回调函数示例:void func(void (*f)(void *), void *p); 调用者
调用者 | 实现者 |
---|
提供一个回调函数,再提供一个准备传给回调函数的参数。 把回调函数传给参数f ,把准备传给回调函数的参数按void * 类型传给参数p
| 在适当的时候根据调用者传来的函数指针f 调用回调函数,将调用者传来的参数p 转交给回调函数,即调用f(p);
|
|