函数本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据-- 整 数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函 数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参 数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback ) 。即让某个系统函数调用的函数。因此可以得出结论:
1 、回调函数是由开发者按照一定的原型进行定义的函数
2 、回调函数并不由开发者直接调用执行
3 、回调函数通常作为参数传递给系统API ,由该API 来调用。
4 、回调函数可能被系统API 调用一次,也可能被循环调用多次。
在Z-stack 里回调函数也非常常见。如在SerialApp 中的串口回调,在HalUARTPoll( void ) 里有 cfg->rxCB( ((cfg->flag & UART_CFG_U1F)!=0), evt ) 调用rxCB.
typedef void (*halUARTCBack_t) (uint8 port, uint8 event);
在SerialApp.c 中自定义了一个函数void rxCB( uint8 port, uint8 event )
又如在SampleApp 例程中,KEY 的回调函数的实现过程如下: