1.Nginx和Redis中两种回调函数写法
#include <stdio.h>
//仿Nginx风格
//结构外声明函数指针类型
typedef void (*ngx_connection_handler_pt)(int c);
//仿redis风格
typedef void redisCommandProc(int c);
typedef struct
{
int a;
//结构内定义函数指针变量pshow
void (*pshow)(int);
//结构内定义函数指针变量
ngx_connection_handler_pt handler;
redisCommandProc *proc;
}TMP;
void func(TMP *tmp)
{
tmp->handler(tmp->a);
tmp->proc(tmp->a);
if(tmp->a >10)//如果a>10,则执行回调函数。
{
tmp->pshow(tmp->a);
}
}
void show(int a)
{
printf("a的值是%d\n",a);
}
void main()
{
TMP test;
test.a = 11;
test.pshow = show;
test.handler = show;
test.proc = show;
func(&test);
}
函数名就是一个指针,如同于数组a[],a和&a其实都是一样的。当调用一个函数时,我们都是直接用函数名调用,或者说通过指针调用。
风格1--tpyedef自定义函数指针类型
#include <stdio.h>
typedef int (*fp_t)(char c);
int f0(char c) {
printf("f0, c = %c\n", c);
return 0;
}
int f1(char c) {
printf("f1, c = %c\n", c);
return 1;
}
int main(){
int ret;
fp_t fp;//fp是一个指向一个函数类型(返回的是int,参数是char)的函数指针
fp = f0;
ret = fp('a');通过函数指针调用函数
fp = f1;
ret = fp('x');
return 0;
}
风格2--typedef自定义函数类型
#include <stdio.h>
typedef int f_t(char c);
int f0(char c) {
printf("f0, c = %c\n", c);
return 0;
}
int f1(char c) {
printf("f1, c = %c\n", c);
return 1;
}
int main()
{
int ret;
f_t *fp;//f_t是函数类型,所以fp是指向此函数类型的指针
fp = f0;
ret = fp('a');
fp = f1;
ret = fp('x');//函数指针调用此函数
return 0;
}