函數指針:
在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
是一個被調用函數。可以看到回調函數中申明的函數指針必須和被調用函數的類型完全相同。
-
Linux
+關注
關注
87文章
11420瀏覽量
212368 -
回調函數
+關注
關注
0文章
88瀏覽量
11792 -
函數指針
+關注
關注
2文章
57瀏覽量
3908
發布評論請先 登錄
相關推薦
評論