- 函数指针
函数指针是一种简洁且高效的编码方式,可以提高代码的复用率,又能利用面向对象语言的某些优点。在数据结构类型(对象)的定义中,你可以包含一组函数指针(方法/接口),于是,该结构的部分/全部操作都可以通过嵌入的函数来完成。
C语言的函数指针在数据结构中大致如下:
struct object {
...
int (*init)(int argc, const char *argv);
int (*mainloop)(int mode);
void (*fini)(void);
...
};
函数指针的优点,在于可以根据不同的准则和对象所扮演的角色不同进行有区别的初始化,因此,调用object->init时,实际上可能会因为不同的object调用不同的init接口。可以产生对上层来说透明化的接口。
在内核方面,函数指针可以作为不同子模块之间的接口,或者一种通用的机制,根据某个子模块所做的某事的结果,在适当的时机调用适当的接口进行处理,在其他情况下,函数指针也可以作为一种通用方式,使得协议、设备驱动程序或某个功能模块的接口特殊化。
注意,调用函数指针时,必须检查该值是否为NULL,避免引用了NULL出现意外。
当然,函数指针也存在缺点,就是阅读代码时容易断,稍显困难,这点明显不同于传统的面向流程的代码。这种情况下,继续阅读代码必须搞清楚该函数指针是如何/在哪里初始化的。
- 虚拟函数表
virtual function table,简称VFT,通常指向一个数据结构的一组函数指针便成为虚拟函数表。
当VFT作为两个子系统之间的接口时,或者VFT只是作为输出或者某个内核组件的接口时,VFT中的函数指针数目可能会膨胀,以包含不同的函数指针,从而适应各种各样的协议或者功能。每种功能实际场景中可能只用到所提供的所有函数指针中的很少一部分。