希望把函數當作參數引入一個新的函數中,可方便的分離底層上層的開發,或方便復雜系統集成。
一般首先定義一種指針函數,可以定義許多,最終這些函數會通過指針方式作為參數來回傳遞。
typedef struct{ //define the function pointer structure int (*func_name_a)(void *parammiter_a, int *parammiter_b); int (*func_name_b)(void *parammiter_c, int *parammiter_d); int (*func_name_c)(void *parammiter_e, int *parammiter_f); } func_sets_t;
定義了一個變量類 func_sets_t,是一個結構體,里面包括了一系列函數,都是函數指針。
接着需要實現一系列函數,一般不會少於func_sets_t可容納的函數數量。
//implement a set of functions int func_name_a_inst(void *parammiter_a, int *parammiter_b){ // data_a return 0; } int func_name_b_inst(void *parammiter_c, int *parammiter_d){ // data_b return 0; } int func_name_c_inst(void *parammiter_e, int *parammiter_f){ // data_c return 0; }
這些函數的參數一般與func_sets_t定義的相一致。
之后編寫需要傳遞函參數的function。
int general_func(int parammiter_g, func_sets_t *call_back){ // data_d switch (parammiter_g){ case 0: call_back->func_name_a(parammiter_a, parammiter_b); break; case 1: call_back->func_name_b(parammiter_c, parammiter_d); break; case 2: call_back->func_name_d(parammiter_e, parammiter_f); break; default: break; } return 0; }
此函數會根據不同的情況,選用合適的函數進行處理。
在main中一般還需要初始化一下指針函數。
int main_0(){ func_sets_t func_inst = { //init the fuction sets. .func_name_a = func_name_a_inst,// .func_name_b = func_name_b_inst, .func_name_c = func_name_c_inst }; general_func(parammiter_g, &func_inst);//invoke call back functions return 0; }
或者可以使用另外一種方式初始化。
void init_func_sets(func_sets_t *call_back){ call_back->func_name_a = func_name_a_inst; call_back->func_name_b = func_name_b_inst; call_back->func_name_d = func_name_c_inst; } int main_1(){ //init the fuction sets. func_sets_t *func_inst; func_inst = (func_sets_t *) malloc (sizeof(func_sets_t)); init_func_sets(func_inst); general_func(parammiter_g, func_inst);//invoke call back functions return 0; }
3/20/2020
siyi