zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    转--安装11g oracle
    数据可视化分析(柱状图、饼图、折线图、雷达图)
    2021双十一自动刷淘宝喵糖Auto.js脚本(安卓适用)
    最近升级了一下小老婆(8核 2x8G DDR3 128G SSD)
    [Orchard CMS系列] 创建主题(Writing a new theme)
    百度,你家云管家能靠谱点不?替你脸红!Shame on you!
    [解决]ASP.NET MVC 4/5 源码调试(source code debug)
    [解决]Kali Linux DHCP自动获取IP失败 坑爹的VMWare桥接
    SSRS 页面默认显示英文
    3.2、OSPF
  • 原文地址:https://www.cnblogs.com/pandaroll/p/12531134.html
Copyright © 2011-2022 走看看