最近一段时间以来,都在想着怎样将程序分层进行模块化,减小程序之间的耦合性。在自学C++一段时间以后,于是有模仿C++的想法,
将相同或者类似的函数都放在同一模块内,能后通过函数指针的方式调用起模块内部的函数。但是在定义函数指针之后,需要对起模块内部
函数指针进行初始化工作方能调用,就好比windows里面的窗口调用一样,在使用之前,先要对窗口类进行注册一个道理。但是又想怎样可
以将函数指针进行常量化初始化,从而保证能像普通函数那样一样调用。如果使用这种方法,必须手工去初始化函数指针,这样会容易产生
人为错误。
在一次看网页的时候,偶然之间在黑金开发版搜索到的一个例子程序,看到了以下类似的函数指针初始化工作。
void module_initial(void); typedef struct { void (* initial) (void); }MODULE_T; MODULE_T module = { .initial = module_initial }; void module_initial(void) { //............ }
可以将此模块放在单独一个模块内。这样在其他程序就可以使用module.initial()来对 module_initial来进行调用了。同理,
模块内的其他函数也可以通过函数指针的方式来实现调用,这样就提高了程序的内聚性,但是此程序在keil中编译的时候,
需要在C/C++编译选项里添加--C99才能编译通过,否则会报错。使用这种方法将会消耗一定的内存资源。调用module.intial()的反汇编为
;;;65 module.initial(); 00003c 4914 LDR r1,|L1.144| 00003e 6808 LDR r0,[r1,#0] ; module 000040 4780 BLX r0
其实质上是编译器帮程序员完成了初始化工作,汇编中所指向的函数地址存储在RAM中。
但是有没有更好的方式可以节省RAM的方式来完成直接调用,不知道哪位大虾有没有更好的方法,还请各位指教。