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);
- }
- }
结果:
|