在linux驱动面向对象编程思想中用的最多,利用函数指针来实现封装,下面以一个简单的例子说明:
复制#include typedef struct TFT_DISPLAY { int pix_width; int pix_height; int color_width; void (*init)(void); void (*fill_screen)(int color); void (*tft_test)(void); }tft_display; static void init(void) { printf(“the display is initialed\n”); } static void fill_screen(int color) { printf(“the display screen set 0x%x\n”,color); } tft_display mydisplay= { .pix_width=320, .pix_height=240, .color_width=24, .init=init, .fill_screen=fill_screen, }; int main(int argc, char **argv) { mydisplay.init(); mydisplay.fill_screen(0xfff); return 0; }上面的例子将一个tft_display封装成一个对象,上面的结构体成员中最后一个没有初始化,这在Linux中用的非常多,最常见的是file_operations结构体,该结构体一般来说只需要初始化常见的函数,不需要全部初始化。上面代码中采用的结构体初始化方式也是在Linux中最常用的一种方式,这种方式的好处在于无需按照结构体的顺序一对一。
回调函数:有时候会遇到这样一种情况,当上层人员将一个功能交给下层程序员完成时,上层程序员和下层程序员同步工作,这个时候该功能函数并未完成,这个时候上层程序员可以定义一个API来交给下层程序员,而上层程序员只要关心该API就可以了而无需关心具体实现,具体实现交给下层程序员完成即可(这里的上层和下层程序员不指等级关系,而是项目的分工关系)。这种情况下就会用到回调函数(Callback Function),现在假设程序员A需要一个FFT算法,这个时候程序员A将FFT算法交给程序员B来完成,现在来让实现这个过程:
复制int InputData[100]={0}; int OutputData[100]={0}; void FFT_Function(int *inputData,int *outputData,int num) { while(num–) { } } void TaskA_CallBack(void (*fft)(int*,int*,int)) { (*fft)(InputData,OutputData,100); } int main(int argc, char **argv) { TaskA_CallBack(FFT_Function); return 0; }上面的代码中复制TaskA_CallBack是回调函数,该函数的形参为一个函数指针,而复制FFT_Function是一个被调用函数。可以看到回调函数中申明的函数指针必须和被调用函数的类型完全相同。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:函数指针与回调函数-函数指针与回调函数 https://www.yhzz.com.cn/a/7800.html