函数指针与面向对象思想
来源:互联网 发布:淘宝收藏量会下降吗 编辑:程序博客网 时间:2024/06/05 23:04
转载请注明出处
作者:小马
函数指针在嵌入式软件领域用得相对还是比较多的,很多时候用函数指针来"模拟"面向对象。 面向对象的概念一经诞生就开始在软件开发中占据主流地位,一直到现在还是如此。甚至在C和汇编占主流的嵌入式软件领域,也有它的一席之地。比如ADS本身提供支持C++的编译器,在微软开放的WINCE源码中,也可以看到很多用C++写的驱动程序.
C++也有它的缺陷, 虑函数,内存回收等机制,让它付出了效率代价. 这可能在其它软件开发领域可以忽略不计,但是在嵌入式软件领域,很多代码是运行在内存空间和主频都非常有限的芯片上, 所以对代码的大小和运行速度都有很严格的要求。
虽然面向对象的语言不能用,但是面向对象的思想可以借鉴。面向对象思想里最重要的概念是类. 在一些嵌入式软件应用中,如果应用了这种思想,你突然发现你的代码变得”高级”了. 举一个以前看过的一例子, 作者用C的结构体与函数指针实现了”类”. 类似于下面的形式
typedef struct Menu{ uint8 xPosition;//菜单的X坐标 uint8 yPosition;//菜单的Y坐标 void (*action)(void);//按下菜单时触发的动作.} Menu
把LCD上每一个菜单都当成一个对象来处理. 这样只需给对应的结构体赋值就可以了,彻底颠覆了用if或switch判断的老式套路。类的思想用在这里实在是太强大了.
假设我写好一个事件处理函数如下面的形式
void Buffer(void)//参数类型和返回值类型是根据指针函数的声明确定的.{…..}
我想实现按到某个菜单时调用上面这个函数. 就可以用下面的形式把这个动作赋给menu的“成员函数”
Menu menu;Menu.action = (void(*)())Buffer;
再来分析一个复杂的函数指针. 在做嵌入式编程有时候我们需要让程序跳到某个地址去执行. 如果用C实现,可以用下面的形式.
(*(void(*)())0)()
看上去很复杂,如果把它拆开来分析就一目了然.
首先0是程序要执行的地址. 然后void(*)()是一个函数指针类型. 就好像int *是一个指向int型的指针类型. 只不过这个函数指针类型同时也声明了函数的返回类型和参数类型. 最后一步就是调用这个函数了. 用函数指针调用函数时用类似于(*p)()这种形式. 这里p就相当于(void(*)()0)了.
- 函数指针与面向对象思想
- 函数指针与C的面向对象
- 面向对象与编程思想
- 面向对象与面向过程设计思想
- 面向对象与面向过程思想比较
- C语言里用结构体和指针函数实现面向对象思想
- java面向对象思想之类与对象
- java面向对象思想之构造函数
- 函数以及面向对象的思想
- 老子的思想与面向对象
- Java基础与面向对象思想
- 黑马程序员-java与面向对象思想
- C语言与面向对象思想
- 关于面向对象思想分析与设计
- 面向对象设计思想与 golang 编程
- 面向对象与面向过程的编程思想比较
- 函数对象与函数指针
- 函数对象与函数指针
- 嵌入式系统工程师必须更聪明地工作
- [转]JScript中Date.getTime转.Net中的DateTime
- 进程退出前删除自身EXE
- MYSQL的慢查询分析
- iPad 和 iPhone Simulator Mac.OS.X.Leopard
- 函数指针与面向对象思想
- NSXMLParser解析多层嵌套xml
- 使用C#多线程程序(2)
- FS2410重新分区nandflash
- 制作一个不在任务栏及任务列表中显示的幽灵程序
- NAND闪存芯片的深入解析
- Linux下C和C++开发基础
- 百年方略:企业战略咨询之要点
- PHILIPS 为什么这样做