Вы, безусловно, можете создать struct
, содержащий указатели на функции.Для этого есть даже веские причины.
В качестве одного примера рассмотрим интерфейс между операционной системой и драйвером устройства.Упрощенно, это может выглядеть примерно так:
struct device {
int (*open)(unsigned mode);
int (*close)(void);
int (*read)(void *buffer, size_t size);
int (*write)(void *buffer, size_t size);
};
Затем отдельный драйвер устройства создаст структуру этого типа и инициализирует отдельные указатели для ссылки на функции, относящиеся к конкретному устройству:
struct device serial_port = {
open_serial,
close_serial,
read_serial,
write_serial
};
struct device ethernet_adapter = {
open_net,
close_net,
read_net,
write_net
};
struct device keyboard = {
open_keyboard,
close_keyboard,
read_keyboard,
NULL // we'll assume no writing to the keyboard...
};
Тогда некоторые высокоуровневые функции могут получить одно из них и открыть / закрыть / прочитать / записать какое-либо устройство без необходимости знать точную идентификацию задействованного устройства.Конечно, для реальной ОС она становится немного более сложной, чем эта, но общая идея (или, по крайней мере, может быть) довольно похожа.