C ADT: * .c включение файла

0

У меня есть абстрактная структура:

[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]

Я действительно не хочу нарушать абстракцию, но я бы предпочел использовать структуру для некоторых из моих реализаций.

  • 1
    Почему бы просто не полностью объявить структуру в заголовке?
  • 0
    Потому что я бы потерял опацитику везде.
Показать ещё 3 комментария
Теги:
include
adt

1 ответ

1

Это довольно распространенный метод черных бокс-структур в 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 */

и т.п.

Тогда ни один код, использующий структуру, не должен видеть фактическую структуру, он просто будет иметь указатель на него и должен вызывать ваши функции для выполнения любых операций над структурой.

  • 0
    Да, у меня есть все это. Дело в том, что в другой структуре я хочу использовать структуру, а не ее указатель, и точно не хочу зависеть от динамического размещения (скажем, в реальном времени).
  • 0
    @ user3020921 Чтобы использовать фактическую структуру, а не указатель на нее, вам необходимо полное определение структуры, которого у вас нет. Вы можете решить эту проблему, имея два заголовочных файла: один общедоступный, который обычно используется, и «закрытый», который используется внутренне вашим кодом и который включает в себя фактическое определение структуры. Если вам нужно использовать структуру, а не указатель, включите частный заголовочный файл. Обратите внимание, что он полностью раскрывает черный ящик, и вы можете подумать о дизайне, в котором вам не нужна структура.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню