结构体函数指针的初始化

时间:2021-04-29 19:46:41

          最近一段时间以来,都在想着怎样将程序分层进行模块化,减小程序之间的耦合性。在自学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的方式来完成直接调用,不知道哪位大虾有没有更好的方法,还请各位指教。