回调函数是函数指针的一个重要用法:
因此先解释一下函数指针,
函数指针:声明 int (*fun)() 或者int* (*func)() 。
()的优先级比*的高,如果不加括号便是指针函数。表示返回的值是一个指针。
typedef enum
{
ADD = 1,
SUB,
MUL,
DIV
} baseAlg_e;
int add(int a, int b)
{
return a+b;
}
int substract(int a, int b)
{
return a-b;
}
int muliply(int a, int b)
{
return a*b;
}
int divide(int a, int b)
{
if (b != 0)
{
return (int)a/b;
}
else
{
return -1;
}
}
/*声明一个callback函数*/
int (*callback1)(int, int);
typedef int (*callback2)(int, int);
/*写法1*/
callback2 callback2Msg;
void register_fun(uint8_t type)
{
switch (type)
{
case ADD:
callback2Msg = &add;
break;
case SUB:
callback2Msg = &substract;
break;
case MUL:
callback2Msg = &muliply;
break;
case DIV:
callback2Msg = ÷
break;
default:
break;
}
}
/*写法2*/
callback2 callbackComponent[4];
void register_fun1(int type, callback2 testcall)
{
callbackComponent[type] = testcall;
}
int main()
{
/*方法1*/
callback1 = &add;
int c = callback1(1,2);
printf("callback 1 is %d", c);
/*方法2*/
callback2 b;
b = &substract;
int d = b(3,3);
printf("callback 2 is %d", d);
/*问题1:如果原来得函数的类型都不一致怎么办?*/
/*方法1的注册*/
register_fun(ADD);
/*方法1的调用*/
int f = callback2Msg(2,3);
printf("method 3 is %d \n", f);
/*方法2的注册*/
register_fun1(ADD, &add);
/*调用*/
int c1 = callbackComponent[ADD](4,5);
printf("method 4 is %d \n", c1);
return 0;
}