C语言中使用函数指针实现回调

写得Java多的同学一般随手写个interface来可以实现回调了。


public  interface CallBack {  
    public void onAnwerListenner(String anwer);  
}  

public class Response {  
    CallBack callBack = null;  // 全局变量

    public void anwer(String question,CallBack callBack){  
        this.callBack=callBack;  
        new Thread(new Runnable() {  

            @Override  
            public void run() {  
                String anwer="the answer is *****";  
                if(callBack!=null)  {  
                    callBack.onAnwerListenner(anwer);// 进行回调

                }  
            }  
        }).start();;  
    }  
} 

关于在C/C++中就不是使用interface了,也可以使用虚函数等形式实现回调,但是需要一个class的支持。
比起使用class再进行继承等工作写法更为简单的就是使用函数指针了。

#include <stdio.h>

int add(int a,int b){
    return a+b;
}

void test(int(*p)(int,int),int a,int b){
    printf("result = %d\n", (*p)(a,b));
}

int main(){
    test(add, 1, 2);
    return 0;
}

运行输出 result = 3

嗯,再加入一个函数指针变量并赋值使用;

#include <stdio.h>

int add(int a,int b){
    return a+b;
}

void test(int(*p)(int,int),int a,int b){
    printf("%d\n", (*p)(a,b));
}

int main(){
    int (*myadd)(int a, int b);
    myadd = &add;
    test(myadd, 1, 2);
    return 0;
}

C/C++拥有函数指针的语法,回调变得异常的简便了;
如果是使用Java的思路,就是建立class,再建立虚函数,进行继承初始化然后回调等系列工作;

如果是封装成SDK,这里参考PJSIP协议栈的库的用法,PJSIP协议栈的SDK使用了大量的回调函数。
向外提供一系列非常简便的回调接口,有:
注册状态回调,呼叫状态回调,对方状态回调(当前正在输入,当前正在振铃,对方执行接听动作,对方执行挂断动作等)。

#include <stdio.h>

typedef int pjsua_call_id;

typedef struct pjsua_callback{

    void (*on_call_media_state)(pjsua_call_id call_id);

}pjsua_callback;

void _on_call_media_state(pjsua_call_id call_id){
    printf("call_id=%d\n", call_id);
}

int main(){
    struct pjsua_callback cfgcallback;
    cfgcallback.on_call_media_state = &_on_call_media_state;
    cfgcallback.on_call_media_state(100);
    return 0;
}

运行输出 call_id=100

PJSIP定义了很多不同用途的结构体,定义了大量的函数指针用于保存对应的回调情况;
如果需要封装SDK,使用大量的函数指针可以更加简洁的对外提供接口;
使用结构体分类保存不同场景下的接口以及变量,利于代码扩展和阅读。

猜测Java里的回调函数实际上也只是函数指针的一种用法,先保存函数地址,然后调用该函数;
回调理应是一种利用函数指针进行函数调用的过程,Java或者其他语言也不例外;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值