函数指针与面向对象思想

来源:互联网 发布:淘宝收藏量会下降吗 编辑:程序博客网 时间: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)了.