C 函数指针与回调函数示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014134138/article/details/81415499

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

创建三个文件,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函数的结果,这就是回调函数的作用之一

猜你喜欢

转载自blog.csdn.net/u014134138/article/details/81415499