C语言回调函数

1. 定义

        把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。换句话说,函数 F1 调用函数 F2 的时候,函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。

        举个例子:

#include<stdio.h>
#include<softwareLib.h> // 包含Library Function所在Software library库的头文件

int Callback() // Callback Function
{
    // TODO
    return 0;
}
int main() // Main program
{
    // TODO
    Library(Callback);
    // TODO
    return 0;
}

        在回调中,主程序把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数(传入不同的回调函数实现,就可以通过库实现不同的功能并且丝毫不需要修改库函数的实现,这就是解耦

        主函数和回调函数是在同一层的,而库函数在另外一层。一般库函数对我们不可见或者不能轻易修改库函数,所以通过传入不同的参数(回调函数来实现通过修改库函数让库函数调用普通函数相同的功能,更加安全和常见。

        这里,main()、Library()和Callback()函数前面 F1、F2和F3函数

2. 使用场景

        如果需要降低耦合度的时候,更应该使用回调函数。

3. 实例

        嵌入式C语言中,回调函数一般结合结构体使用。

/*
仅回调函数核心代码
*/
struct oreder_code_desc
{
    int order_code_ID;
    void (*callback)(int channel, char *SetValue);
};

static struct oreder_code_desc OrderCodeInfo[]={
    {DBID_RING_CODE, RingCodeAction},           /*0*/
    {DBID_PRV_ORDER_CODE, PrvCodeAction},       /*1*/
};


int OrderCodeMatch(word_t channel, char *matchbuff)
{
    int i;
    char paramdata[32];
    char SetValueBuff[32] = "";
    if(NULL == matchbuff || (0 == strcmp(matchbuff, "")))
    {
        return -1;
    }
    for(i = 0; i < sizeof(OrderCodeInfo)/sizeof(OrderCodeInfo[0]); i++){
        memset(paramdata, 0, sizeof(paramdata));
        dbGetParam(OrderCodeInfo[i].order_code_ID, channel, paramdata);
        if((0 == strncmp(matchbuff, paramdata, strlen(paramdata))) && (strlen(paramdata) != 0)){
            sscanf(matchbuff + strlen(paramdata), "%[^#]", SetValueBuff);
            OrderCodeInfo[i].callback(channel,SetValueBuff);
        }
    }
    FV_TRACE("@@@@@@@@**********         @KeyBuff  [%s], DBID_ORDER_CODE  [%s]", matchbuff, paramdata);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值