回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
创建三个文件,main.c,vendor.c,vendor.h
Main.c是用户开发的
Vendor.c和vendor.h是开发者实现的。
开发者的角色完完全全可以将add_value实现的add_ret这个函数封装起来并且加密,然后扔一个.so或者.a给用户,那么用户就看不到具体add_ret的实现内容,用户只需要开发者给他提供一个.h和.so即可,这样,作为开发者,他就将他实现的函数功能给保密了。
示例:
main.c:
#include <stdio.h>
#include "vendor.h"
int add(int a , int b , int (*add_value)())
{
return (*add_value)(a,b);
}
int main(void)
{
int sum = add(3,4,add_ret);
printf("sum:%d\n",sum);
return 0 ;
}
vendor.c:
#include "vendor.h"
int add_ret(int a , int b)
{
return a+b ;
}
vender.h:
#ifndef __VENDOR_H
#define __VENDOR_H
int add_ret(int a, int b) ;
#endif
将vendor.c和vendor.h打包成一个动态链接库
生成动态库:
gcc -shared -fPIC dvendor.c -o libvendor.so
-shared : 生成动态库;
-fPIC : 生成与位置无关代码;
-o :指定生成的目标文件;
使用动态库:
gcc main.c -L . –lvendor -o main
-L : 指定库的路径(编译时); 不指定就使用默认路径(/usr/lib/lib)
-lvendor : 指定需要动态链接的库是谁;
代码运行时需要加载动态库:
./main 加载动态库 (默认加载路径:/usr/lib /lib ./ …)
./main
我们将编译动态库生成的libvendor.so拷贝到/usr/lib后,现在就不需要vendor.c了,此时我们将vendor.c移除,也可以正常的编译并且执行main函数的结果,这就是回调函数的作用之一