• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C语言回调函数,声明,初始化

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

希望把函数当作参数引入一个新的函数中,可方便的分离底层上层的开发,或方便复杂系统集成。

一般首先定义一种指针函数,可以定义许多,最终这些函数会通过指针方式作为参数来回传递。

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

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#利用ADO.NET导出大批量数据发布时间:2022-07-13
下一篇:
C#中Quartz的简单易懂定时任务实现发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap