У меня есть абстрактная структура:
[Trame.h]typedef struct s_trame t_trame;
// Allocation, setters and getters prototypes
[/Trame.h]
[Trame.c]
# include "trame.h"
struct s_trame
{
}
// Allocation, setters and getters implementations
[/Trame.c]
В другом файле мне нужно знать поля в t_trame. Единственный способ сделать это — включить файл trame.c. Насколько это плохо в этом конкретном контексте или как сделать это лучше?
[Main.c]# include "trame.h"
# include "trame.c"
int main()
{
t_trame trame;
// Do something with trame
return 0;
}
[/Main.c]
Я действительно не хочу нарушать абстракцию, но я бы предпочел использовать структуру для некоторых моих реализаций.
Это довольно распространенный метод создания структур черного ящика в C. Но для создания структур действительно непрозрачный, вы должны обернуть весь доступ к структуре, включая создание и уничтожение, в функции.
подобно
t_trame *trame_create(); /* Allocates and initializes the structure */
void trame_destroy(t_trame *); /* Frees the structure */
void trame_do_something(t_trame *, int some_argument); /* Does something with the structure */
int trame_get_some_data(t_trame *); /* Returns some data from the structure */
и т.п.
Тогда никакой код, использующий структуру, не должен видеть фактическую структуру, он просто будет иметь указатель на нее и должен вызывать ваши функции для выполнения каких-либо операций над структурой.