Интересно, я никогда не думал об этом решении раньше.
Первое, конечно, стандартное, и я готов поспорить, что это то, что вы найдете в подавляющем большинстве проектов C [*].
Второй в теории занимает память, поскольку вы фактически объявляете объект данных, полный указателей на функции.Вам, конечно, также нужно инициализировать переменную kernel
, т.е. иметь что-то вроде:
...
} kernel = {
.init = kernel_init,
.start = kernel_start,
};
Но, ооо, вы снова идете с префиксными функциями.Чтобы устранить необходимость в них, функции должны быть static
, что, я думаю, возможно, если вы добавите extern
к объявлению struct
в kernel.h
.
Так что более полный примерэто может быть:
// kernel.h (public header)
typedef struct kernel_api {
void (*init)(void);
int (*start)(void* foo);
} kernel_api;
extern const kernel_api kernel;
// in kernel.c
static void init(void)
{
...
}
static int start(void *foo)
{
..
}
const kernel_api kernel = {
.init = init,
.start = start,
};
Это может сработать, но я не пробовал.
Наконец, наличие явных данных означает, что для их оптимизации требуется достаточно умный компилятор, который сделает их более прямыми.звонки, но я не пробовал, и это немного рискованно зависеть от таких.Интересно.
[*] Я просто статистически утверждал, что видел (или думал) о подавляющем большинстве мировых проектов C, но это, конечно, неправда.:)