У меня есть абстрактная структура:
[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 */
и т.п.
Тогда ни один код, использующий структуру, не должен видеть фактическую структуру, он просто будет иметь указатель на него и должен вызывать ваши функции для выполнения любых операций над структурой.