【转】C语言函数指针实现接口思想

[复制链接]
824|8
 楼主| 焚琴煮鹤 发表于 2016-12-22 13:22 | 显示全部楼层 |阅读模式

C语言函数指针实现接口思想


  C语言作为经典的面对过程编程语言,自其产生已经历了很多年,这期间也出现了很多其他的编程语言,但C语言仍然被很多编程人员使用,说明C语言有着其独特的地方。面对对象编程是一种思想,它是由面度过程编程逐步演化而来,所以其可以通过面对过程编程语言实现。指针是C语言比较点睛之笔,使用指针可以更方便的操作变量,但指针也有着自身的弊端如内存泄露等不安全问题,因而被面对对象编程所隐藏,不对用户开放,但笔者认为,面对对象很多特性的实现离不开指针的运用,比如,创建对象引用、回调、C#中的委托以及Java中的事件监听等。本文的内容重点就在指针:函数指针。函数指针的相关内容请自行百度脑补,本文侧重于具体实现。

  面对对象的一个很重要的思想是接口思想,接口思想可以实现让用户不必深入了解接口内部而只需了解接口功能,直接使用接口就可以。本文将通过C语言的函数指针通过简单的例子实现接口思想。


下面先通过.h及.c文件模拟定义一个接口:

[cpp] view plain copy
print?


  • #ifndef MYFUN_C  
  • #define MYFUN_C  
  •   
  • #include "stdio.h"  
  •   
  • int(*fun)(int, int);    //函数指针  
  • void operate(int a, int b);//要执行的操作  
  • void(*OnReceived)(int *datas,int len);//接收到数据时执行的操作,实现事件监听  
  •   
  • #endif  

[cpp] view plain copy
print?


  • #include "myfunc.h"  
  •   
  • void onReceived(int* datas,int len)  
  • {  
  •   if (OnReceived != NULL) //判断是否指向了监听函数  
  •     OnReceived(datas,len);  
  • }  
  • void operate(int a, int b)  
  • {  
  •   int arr[] = {2*a,5*b};  
  •   if (fun != NULL) //判断是否指向了监听函数  
  •   {  
  •   printf("fun被执行...\n");  
  •   printf("结果:%d\n", fun(a, b));  
  •   }  
  •   onReceived(arr,2);  
  • }  


在主函数中引用接口:

[cpp] view plain copy
print?


  • #include "myfunc.h" //引用定义的接口  

定义自己的接口功能即fun的要指向的函数:

[cpp] view plain copy
print?


  • int add(int a, int b)  
  • {  
  •     return a + b;  
  • }  
  • int minus(int a, int b)  
  • {  
  •     return a - b;  
  • }  
  • int multi(int a, int b)  
  • {  
  •     return a*b;  
  • }  

让fun指向某一个函数:

[cpp] view plain copy
print?


  • fun = multi;  
  • //fun = add;  
  • //fun = minus;  

定义事件监听函数:

[cpp] view plain copy
print?


  • void myOnReceived(int *datas,int len)  
  • {  
  •     int* p = datas;  
  •     printf("myOnReceived被执行...\n");  
  •     for (p = datas; p < &datas[len]; p++)  
  •     {  
  •         printf("接收到的数据:%d\n",*p);  
  •     }  
  • }  

为事件创建监听:

[cpp] view plain copy
print?


  • OnReceived = myOnReceived;   



完整main.c代码:

[cpp] view plain copy
print?


  • #include "stdio.h"  
  • #include "myfunc.h" //引用定义的接口  
  •   
  • int add(int a, int b)  
  • {  
  •     return a + b;  
  • }  
  • int minus(int a, int b)  
  • {  
  •     return a - b;  
  • }  
  • int multi(int a, int b)  
  • {  
  •     return a*b;  
  • }  
  • void myOnReceived(int * datas,int len);  
  • void main()  
  • {  
  •     OnReceived = myOnReceived; //为监听定义事件  
  •     fun = multi; //定义fun功能  
  •     //fun = add;  
  •     //fun = minus;  
  •     operate(4, 3);   
  •     printf("\n");  
  • }  
  • void myOnReceived(int *datas,int len)  
  • {  
  •     int* p = datas;  
  •     printf("myOnReceived被执行...\n");  
  •     for (p = datas; p < &datas[len]; p++)  
  •     {  
  •         printf("接收到的数据:%d\n",*p);  
  •     }  
  • }  


结果:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
comeon201208 发表于 2016-12-25 21:49 | 显示全部楼层
这个主要是关于参数引用的问题的探讨的。
jimmhu 发表于 2016-12-26 22:30 | 显示全部楼层
指针是C语言的精华。
jimmhu 发表于 2016-12-26 22:30 | 显示全部楼层
有关于指针的教程分享吗?
plsbackup 发表于 2016-12-27 17:09 | 显示全部楼层
现在代码还不怎么会用指针呢。
plsbackup 发表于 2016-12-27 17:12 | 显示全部楼层
C语言的指针用好了还行,用不好程序就算废了。
angerbird 发表于 2016-12-28 22:12 | 显示全部楼层
指针的作用在函数设计中是显而易见的。
@若水 发表于 2017-1-12 15:12 | 显示全部楼层
绕成这样,差点就看不懂了,你这个虽说是监听,但写得太隐秘了,差点都找不着了
firstblood 发表于 2017-1-13 21:43 | 显示全部楼层
指针的参数引入引用是很重要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

106

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部