C語言回調函數,聲明,初始化


希望把函數當作參數引入一個新的函數中,可方便的分離底層上層的開發,或方便復雜系統集成。

一般首先定義一種指針函數,可以定義許多,最終這些函數會通過指針方式作為參數來回傳遞。

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM