在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
是一个被调用函数。可以看到回调函数中申明的函数指针必须和被调用函数的类型完全相同。
全部0条评论
快来发表一下你的评论吧 !