函数指针: 在linux驱动面向对象编程思想中用的最多,利用函数指针来实现封装,下面以一个简单的例子说明:
#include typedef struct tft_display{ int pix_width; int pix_height; int color_width; void (*init)(void); void (*fill_screen)(int color); void (*tft_test)(void);}tft_display;static void init(void){ printf(the display is initialed\n);}static void fill_screen(int color){ printf(the display screen set 0x%x\n,color);}tft_display mydisplay={ .pix_width=320, .pix_height=240, .color_width=24, .init=init, .fill_screen=fill_screen,};int main(int argc, char **argv){ mydisplay.init(); mydisplay.fill_screen(0xfff); return 0;} 上面的例子将一个tft_display封装成一个对象,上面的结构体成员中最后一个没有初始化,这在linux中用的非常多,最常见的是file_operations结构体,该结构体一般来说只需要初始化常见的函数,不需要全部初始化。上面代码中采用的结构体初始化方式也是在linux中最常用的一种方式,这种方式的好处在于无需按照结构体的顺序一对一。
回调函数: 有时候会遇到这样一种情况,当上层人员将一个功能交给下层程序员完成时,上层程序员和下层程序员同步工作,这个时候该功能函数并未完成,这个时候上层程序员可以定义一个api来交给下层程序员,而上层程序员只要关心该api就可以了而无需关心具体实现,具体实现交给下层程序员完成即可(这里的上层和下层程序员不指等级关系,而是项目的分工关系)。这种情况下就会用到回调函数(callback function),现在假设程序员a需要一个fft算法,这个时候程序员a将fft算法交给程序员b来完成,现在来让实现这个过程:
int inputdata[100]={0};int outputdata[100]={0};void fft_function(int *inputdata,int *outputdata,int num){ while(num--) { }}void taska_callback(void (*fft)(int*,int*,int)){ (*fft)(inputdata,outputdata,100);}int main(int argc, char **argv){ taska_callback(fft_function); return 0;} 上面的代码中taska_callback是回调函数,该函数的形参为一个函数指针,而fft_function是一个被调用函数。可以看到回调函数中申明的函数指针必须和被调用函数的类型完全相同。
基于IP网络架构实现网络监控系统的设计方案
航空接插件的选择方法以及使用规则
什么是抖动?使用抖动消除量化失真
数据标签体系要如何建立?
浅谈TCP面向连接的虚电路实现
函数指针与回调函数
华为鸿蒙系统2.0手机Beta版将在12月16日发布
基于可控硅的过零触发电路图
关于锂电池内阻知识详解
分析师称苹果已降低iPhone产量为新机做准备
2020年5G网络占无线网络设施支出5%,2025年为40%
3D可视化数字孪生的功能作用是什么
脉冲控制仪怎么调节
2019年中兴通讯将持续加大5G研发投入
西门子S7-200smart与三菱FX2N自由口通信
基于天线下倾角和方位角调整的网络优化
如何设计出更高能效的充电桩和服务器应用
魅族旗舰PRO 7宣布30号发布?处理器还是联发科
苹果或在推AR眼镜前推VR头显设备
北欧航空将与空客共同探索如何在交通营运中引入油电混合动力飞机