假设您是嵌入式程序员。现在你有了一些带有可交换模块的硬件。对于每个模块,您必须以不同的方式进行通信,即。你以不同的方式初始化/读取/写入/写入它。
现在您的软件必须处理所有这些模块类型。您有 3 个例程(此处简化)来初始化、读取、写入每种类型的模块(HW0 是模块 A,HW1 是模块 B)。
void HW0_init() { printf("HW0_init\n"); }
void HW0_read() { printf("HW0_read\n"); }
void HW0_write(){ printf("HW0_write\n"); }
void HW1_init() { printf("HW1_init\n"); }
void HW1_read() { printf("HW1_read\n"); }
void HW1_write(){ printf("HW1_write\n"); }
现在想象一下你想初始化你的模块并从中读取一些东西,所以你这样做:
int hw_id = 1;
// want to init hardware
switch(hw_id)
{
case 0: HW0_init(); break;
case 1: HW1_init(); break;
// ...
}
// now I want to read
switch(hw_id)
{
case 0: HW0_read(); break;
case 1: HW1_read(); break;
// ...
}
这可以使用指向数组的指针以不同的方式完成。如果您像这样声明指向函数的指针数组:
// as many arrays as you have modules
void (*hw0[3])() = { HW0_init, HW0_read, HW0_write };
void (*hw1[3])() = { HW1_init, HW1_read, HW1_write };
您的代码可能会简化为:
enum HW_ACTION
{
HW_INIT = 0,
HW_READ = 1,
HW_WRITE = 2
};
// pointer to array of pointers to funcs taking nothing
// and returning nothing
void (*(*f)[3])(void);
// detect hardware and set 'f'
f = &hw1;
(*f)[HW_INIT](); // same as HW1_init(); <=> hw1[HW_INIT]();
(*f)[HW_READ](); // same as HW1_read(); <=> hw1[HW_READ]();
相同的效果 - “更简单的代码”。
您可以将其视为poor's man virtual methods
没有 C++ 编译器的 C 用户,您通常会使用init
, read
,write
方法创建基本抽象类并为每种模块实现它们。
现实生活在这里http://en.wikipedia.org/wiki/Virtual_method_table。