说起回调函数,我们通常想到的就是Java编程里面的Callback,基于接口实现。使用的时候传入一个对象的引用然后再在需要的地方调用对象里的方法即可。众所周知,Java编程里引用的概念即指C 语言里指针传址的实现。所以参照Java里回调函数的实现模式,在C语言里也能很轻松的实现回调的功能。
callback.h
#ifndef CALLBACK_H_
#define CALLBACK_H_
typedef void* callback(char* name);
void set_callback(callback *cb);
void test_call(char* name);
#endif /* CALLBACK_H_ */
callback.cpp
#include <stdio.h>
#include "callback.h"
callback *_cb;
void* default_callback(char* name) {
printf("default callback %s\n", name);
}
void set_callback(callback *cb) {
_cb = cb;
}
void test_call(char* name) {
if (_cb == NULL) {
default_callback(name);
} else {
_cb(name);
}
}
main.cpp
#include "callback.h"
#include <stdio.h>
void* my_callback(char* name) {
printf("my callback %s\n", name);
}
int main(){
test_call("flueky");
set_callback(my_callback);
test_call("heheda");
return 0;
}
以上三个文件,简单的实现了C语言回调函数的demo。提供一个默认的callback和用户自定义一个callback。 当没有执行set_callback函数,test_call方法将调用默认的callback。执行代码set_callback(my_callback),会将字符串“heheda”传入my_callback函数,用户在my_callback函数里继续实现自己的逻辑,是不是和Java的callback很相似呢?
这里的关键就是用typedef定义的一个函数指针类型callback。callback指向的是void* 类型的函数地址,当_cb未赋值时,_cb==NULL,执行函数default_callback,当_cb指向my_callback时,就通过_cb调用了函数my_callback。