回调函数就是一个通过函数指针调用的函数。如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我
们就说这是回调函数。例如上层用户程序将函数指针传给底层库,底层库通过函数指针调用上层实现的函数,这样可以实现以前的程序(库)调用
现在实现的函数。
下面我们以一个简单的例子来说明。在目录下创建3个文件main.c、mylib.c、mylib.h。
mylib.c和mylib.h是以前实现的用于生成库的程序,main.c是现在实现的用户程序。
main.c代码如下:
#include <stdio.h>
#include "mylib.h"
int add(int a , int b)
{
return a + b ;
}
int dec(int a , int b)
{
return a - b ;
}
int product(int a , int b)
{
return a * b ;
}
struct fun_operation my_fun_operation={
.add_fun=add,
.dec_fun=dec,
.product_fun=product,
};
int main(void)
{
struct math_result_t result;
math(2,5,&my_fun_operation,&result);
printf("sum:%d\n",result.sum);
printf("dec:%d\n",result.dec);
printf("product:%d\n",result.product);
return 0 ;
}
mylib.c代码如下:
#include<stdio.h>
#include "mylib.h"
void math(int a , int b , struct fun_operation *ps,struct math_result_t *pr)
{
pr->sum=ps->add_fun(a,b);
pr->dec=ps->dec_fun(a,b);
pr->product=ps->product_fun(a,b);
printf("lib process...\n");
}
mylib.h代码如下:
#ifndef __MYLIB_H
#define __MYLIB_H
struct fun_operation{
int (*add_fun)(int,int);
int (*dec_fun)(int,int);
int (*product_fun)(int,int);
};
struct math_result_t{
int sum;
int dec;
int product;
};
void math(int a , int b , struct fun_operation *ps,struct math_result_t *pr);
#endif
实验步骤如下:
在linux下制作动态链接库,将mylib.c和mylib.h打包成一个动态链接库
生成动态库:
gcc -shared -fPIC mylib.c -o libmylib.so
-shared : 生成动态库;
-fPIC : 生成与位置无关代码;
安装库:
mv libmylib.so /usr/lib
mv mylib.h /usr/lib
使用动态库:
gcc -o main main.c –lmylib
-lmylib : 指定需要动态链接的库是谁;
运行程序:
./main