Я даже не уверен, как правильно сформулировать вопрос об этом.Скрытие деталей реализации при передаче данных вокруг
Я пишу библиотеку, где у меня есть несколько реализаций (несколько библиотек из одного). Я хочу скрыть как можно больше, если не все, детали реализации из клиентского приложения, чтобы написать приложение, не считаясь с деталями реализации.
Все в порядке, когда реализация содержится в одной функции. Однако часто мне нужно создать экземпляр структуры из библиотеки, сделать что-то с ней с помощью функции из библиотеки, возобновить запись приложения как обычно, а затем вернуться к функции из библиотеки с данными из предыдущей функции из библиотеки.
Детали строения важны ТОЛЬКО для функций библиотеки. Из-за этого мне не нужно видеть или прикасаться к ним из клиентского приложения.
Итак, есть ли способ скрыть детали структуры из клиентского приложения и по-прежнему иметь возможность использовать его или если есть другой способ сделать это с помощью какой-либо формы инкапсуляции или, возможно, даже каких-то данных (globals?), Видимых только в библиотеку?
Вот мой хромой пример иллюстрации с кодом:
/*
library_private.h
*/
#if (A)
{
struct mystruct_t {
A *something;
}
}
#else
struct mystruct_t {
B *something;
}
#endif
/*
library_public.h
*/
struct mystruct_t;
/*
library.c
*/
struct mystruct_t* create() {
struct mystruct_t *handle = malloc(sizeof(struct mystruct_t));
return handle;
}
/*
client.h
*/
struct mystruct_t;
/* but, I need a definition, so I have to repeat either from library_private.h */
/*
client.c
*/
int main(int argc, char const *argv[]) {
struct mystruct_t *handle = create();
/*...*/
something(handle);
return 0;
}
Хорошо, это похоже на вариант и работает. Я посмотрю, есть ли лучшие варианты перед закрытием. Благодаря! – Keyframe
Я бы не рекомендовал это. Я подозреваю, что вероятность передачи неправильной 'void *' в неправильную функцию * намного * больше, чем« случайно »доступ к структуре, когда вы пытаетесь не делать этого. – EOF
Что бы вы порекомендовали затем сохранить данные между вызовами библиотеки и в то же время скрыть специфику реализации от клиента и избежать глобальных библиотек? – Keyframe