реклама на сайте
подробности

 
 
> Проект из многих файлов на C, Как использовать заголовочные файлы?
ViKo
сообщение Mar 23 2014, 06:57
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Давно терзаюсь вопросами.
Имею проект из нескольких c-файлов. Один из них - главный, main.c, в остальных - некие функции (как разбить проект на части - тоже вопрос смутный, как и понятия "драйвер", "core").
Чтобы функции могли вызываться из любого файла, нужно описать их прототипы. Я их описываю в заголовочных h-файлах, соответствующих c-файлам (display.c - display.h). А чтобы не включать всю кучу h-файлов во все c-файлы, собрал их в одну кучу в main.h. Вот его и включаю во все c-файлы (и в main.c тоже). Где-то видел, такие h-файлы называются "helper".
Чтобы h-файлы не включались в проект по нескольку раз, заключаю все содержимое в макроопределения:
Код
#ifndef DISPLAY_H
#define DISPLAY_H
...
#endif

Также есть отдельные h-файлы, для частных включений.
С глобальными переменными дело обстоит чуть сложнее. В своем файле они должны быть определены, а в остальных заданы, как extern. Для этого пользуюсь макроопределениями (создал в main.h):
Код
#ifndef VAR_DECLS
#define _DECL extern
#define _INIT(x)
#else
#define _DECL
#define _INIT(x) = x
#endif

Только в одном main.c файле задаю определение #define VAR_DECLS, поэтому все переменные будут определены в main.c, независимо от того, в каком h-файле они описаны.

Не слишком ли я запутываю свои проекты? Например, гложет мысль, как правильнее - использовать display.h в main.h или в display.c?
Поделитесь своими решениями. По каким критериям разбиваете проект на файлы? Где храните переменные?
Как передаете глобальные макроопределения (например, #define BUFF_SIZE 4096)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Mar 23 2014, 14:43
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ViKo @ Mar 23 2014, 08:57) *
Не слишком ли я запутываю свои проекты? Например, гложет мысль, как правильнее - использовать display.h в main.h или в display.c?
Поделитесь своими решениями. По каким критериям разбиваете проект на файлы? Где храните переменные?
Как передаете глобальные макроопределения (например, #define BUFF_SIZE 4096)?


Нет не запутываете, вы просто копируете в принципе неплохие практики продвигаемые Micrium-ом и другими.

Но это еще приемлемо для небольших проектов в пару десятков файлов.
А если в проекте счет файлам идет на сотни (а это средненький дивайс с GUI, FS, TCP, RTOS ), то этот подход не работает.

Представьте себе main.h с этаким списком в несколько сот заголовочных файлов. Только взглянув на такой поплохеет.
Управлять таким и разруливать взаимозависимости просто катастрофа.
Проект обязательно надо преобразовать в иерархическую структуру.

Поэтому если хотите делать серьезные проекты сразу думайте над иерархией.
Иерархия это например: плата (BSP), платформа (PSP), архитектура/драйвера, приложение.
Также стоит сразу думать о реюзинге. Отсюда может следовать, что не стоит располагать все глобальные переменные в одном файле.
Потом стоит подумать о многозадачности, это может потребовать как можно больше глобальных переменных скомпоновать в структуры чтобы превратить их потом в динамически создаваемые.
И т.д.
Что касается разбивки на файлы, то могу назвать пару критериев.
Как только размер файла подошел к 50 Кб, то его надо как-то разбить, а то время скролинга исходников начинает неявно доминировать в процессе разработки.
Если планируется реюзинг каких-то модулей, то эти модули разделяются на файлы зависимые и независимые от платформы.
Опять же реюзинг заставляет изобретать уровни абстракции, это тоже порождает файлы.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 23 2014, 15:10
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AlexandrY @ Mar 23 2014, 17:43) *
Представьте себе main.h с этаким списком в несколько сот заголовочных файлов. Только взглянув на такой поплохеет.
Управлять таким и разруливать взаимозависимости просто катастрофа.

Смотрю на примеры с USB, и не въезжаю, что какие файлы делают. Вот их там пара десятков и есть, но не запомнить, где что искать. Много мелких файлов запутывают.
С другой стороны, файлы своих исходников есть и больше 150 KB. Да, искать напрягает, Notepad++ пыхтит вместе со мной, зато знаю, что оно где-то там. rolleyes.gif
Количество файлов как раз под два десятка подбирается. И в них есть и GUI, и RTOS, и DSP. А еще надо и USB, FS...
Пока держу все в одном каталоге. Но Keil уже сам создает несколько папок с исходниками в проекте.
И еще хочется как-то уровнять файлы по размеру, тоже ищу логику, как делить.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Проект из многих файлов на C   Mar 23 2014, 06:57
- - aaarrr   Цитата(ViKo @ Mar 23 2014, 10:57) Не слиш...   Mar 23 2014, 08:12
|- - ViKo   Цитата(aaarrr @ Mar 23 2014, 11:12) Это п...   Mar 23 2014, 08:22
|- - aaarrr   Цитата(ViKo @ Mar 23 2014, 12:22) Реально...   Mar 23 2014, 08:52
|- - ViKo   Цитата(aaarrr @ Mar 23 2014, 11:52) Не ну...   Mar 23 2014, 09:15
- - seneka   Цитата(ViKo @ Mar 23 2014, 10:57) Давно т...   Mar 23 2014, 08:14
- - ViKo   Тут вот какой вопрос - если бы переменная или макр...   Mar 23 2014, 10:18
- - dxp   QUOTE (ViKo @ Mar 23 2014, 13:57) Давно т...   Mar 23 2014, 10:33
|- - ViKo   Цитата(dxp @ Mar 23 2014, 13:33) Аналогич...   Mar 23 2014, 10:49
|- - dxp   QUOTE (ViKo @ Mar 23 2014, 17:49) А с-фай...   Mar 24 2014, 02:47
|- - AlexandrY   Цитата(ViKo @ Mar 23 2014, 17:10) Да, иск...   Mar 23 2014, 15:56
|- - ViKo   Цитата(AlexandrY @ Mar 23 2014, 18:56) Ну...   Mar 23 2014, 16:18
|- - AlexandrY   Цитата(ViKo @ Mar 23 2014, 18:18) SlickEd...   Mar 23 2014, 16:41
|- - _Pasha   Цитата(ViKo @ Mar 23 2014, 19:18) SlickEd...   Mar 24 2014, 05:21
|- - ViKo   Цитата(_Pasha @ Mar 24 2014, 08:21) Попро...   Mar 24 2014, 05:47
|- - halfdoom   Цитата(ViKo @ Mar 24 2014, 08:47) halfdoo...   Mar 24 2014, 07:02
|- - ViKo   Цитата(ViKo @ Mar 24 2014, 08:47) Это всё...   Apr 1 2014, 11:36
- - AnatolyT   Так как до сих пор не делал крупные проекты, типич...   Mar 23 2014, 16:47
- - halfdoom   Цитата(ViKo @ Mar 23 2014, 09:57) Не слиш...   Mar 24 2014, 01:59
- - kolobok0   Цитата(ViKo @ Mar 23 2014, 10:57) ...чтоб...   Mar 24 2014, 02:24
- - AnatolyT   Хотел бы добавить к своему сообщению здесь, ничего...   Mar 24 2014, 02:54


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016