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

 
 
> include в хидере - всё таки это доро или зло?, Есть противоположные мнения, хочется понять их
Cosmojam
сообщение Oct 10 2013, 22:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Речь идёт про Си. Си++ не трогаем, хотя догадываюсь что аргументы там те же.

Существует мнение что писать в .h все необходимые инклюды - это плохо. Единственное подтверждение почему это плохо что мне удалось найти - время компиляции увеличивается. Многократные инклюды одного хидера лечатся очень просто с помощью ifndef/define и как аргумент не рассматриваются т.к. без защиты от множественных инклюдов в любом проекте где один хидер используется более чем в 1 .c файле будут проблемы.

Мой аргумент почему это стоит делать: Хидер - это заголовок модуля, определяющий его публичный интерфейс. Логично расположить в нём всё необходимое для работы модуля, а в .с файле инклюдить только один этот заголовок т.о. отделив реализацию от интерфейса. Улучшается наглядность т.к. сразу в хидере видно зависимости от других модулей.
Погуглив можно найти мнение со ссылкой на NASA C coding standard где написано
Цитата
(4)
The unit header file shall contain #include statements for all other headers required by the unit
header. This lets clients use a unit by including a single header file.


Так как же "правильнее"? NASA не дураки ведь. Так почему существуют противоположные мнения?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Oct 11 2013, 05:47
Сообщение #2


Ally
******

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



Цитата(Cosmojam @ Oct 11 2013, 01:00) *
Существует мнение что писать в .h все необходимые инклюды - это плохо.
Единственное подтверждение почему это плохо что мне удалось найти - время компиляции увеличивается...


В мелких проектах (десятки файлов) не имеет никакого значения.

Но в в больших проектах (сотни и тысячи файлов) структура хидеров самая большая проблема.
Тут никакие мнения не работают, все делается по обстановке.

Хидеры разных сторонних модулей могут содержать повторяющиеся имена (стабильно все переопределяют TRUE, FALSE, ERROR, OK и т.п. ), т.е. их просто невозможно разместить в одном общем хидере.
Часто переопределяются стандартные C-и функции, которые в основном приложении может переопределять нежелательно.
Сторонние модули уже могут идти со своей распределенной структурой хидеров и собрать из них один общий не представляется возможным.
В больших проектах также стоит отделять хидеры отлаженных сторонних модулей как например RTOS, GUI, FS от хидеров приложения.
Поскольку приложение постоянно рефакторится и любое изменение в приложение приводит к перекомпиляции всех модулей в случае общего хидера.
И т.д.
Вообщем все определяет технология.

Go to the top of the page
 
+Quote Post
halfdoom
сообщение Oct 11 2013, 06:12
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(AlexandrY @ Oct 11 2013, 08:47) *
В мелких проектах (десятки файлов) не имеет никакого значения.

Но в в больших проектах (сотни и тысячи файлов) структура хидеров самая большая проблема.
Тут никакие мнения не работают, все делается по обстановке.


+1. Очень простой пример: есть большой модуль, с парой десятков интерфейсных функций. Среди них есть одна, редко используемая функция, которая получает в качестве аргумента указатель на структуру foo: "void fn22(struct foo *);". Ради компилируемости, можно добавить include "foo.h", но если этот foo.h тянет за собой еще десяток инклюдов, то лучше просто объявить структуру как "struct foo;" и возложить необходимость включения foo.h на пользователя, которому эта структура понадобится.

Кроме того, следует руководствоваться правилом наименьшего замусоривания пространства имен, т.к. чем больше будет включено заголовков, тем больше вероятность конфликта определений из них, с определениями пользователя, поскольку он может использовать лишь часть функционала предоставляемого в вашем заголовочном файле.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 11 2013, 06:34
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Немного offtopic...
Чтобы не слишком много переживать о времени компиляции стоит применять "библиотечный подход"
и все более-менее крупные модули собирать в виде отдельных библиотек и линковать их к результирующему проекту.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cosmojam   include в хидере - всё таки это доро или зло?   Oct 10 2013, 22:00
- - Сергей Борщ   QUOTE (Cosmojam @ Oct 11 2013, 01:00) Хид...   Oct 11 2013, 06:53
|- - Cosmojam   Цитата(Сергей Борщ @ Oct 11 2013, 09:53) ...   Oct 11 2013, 10:34
||- - Сергей Борщ   QUOTE (Cosmojam @ Oct 11 2013, 13:34) Ок,...   Oct 11 2013, 10:58
|- - ar__systems   Цитата(Сергей Борщ @ Oct 11 2013, 01:53) ...   Oct 13 2013, 20:35
- - _Pasha   Инклюды в хедере - вне добра и зла и их применение...   Oct 11 2013, 07:01
|- - AlexandrY   Цитата(_Pasha @ Oct 11 2013, 10:01) Инклю...   Oct 11 2013, 08:04
|- - Сергей Борщ   QUOTE (AlexandrY @ Oct 11 2013, 11:04) За...   Oct 11 2013, 08:17
|- - AlexandrY   Цитата(Сергей Борщ @ Oct 11 2013, 11:17) ...   Oct 11 2013, 08:38
- - XVR   Цитата(Cosmojam @ Oct 11 2013, 02:00) Сущ...   Oct 11 2013, 07:43
- - kolobok0   Цитата(Cosmojam @ Oct 11 2013, 02:00) ..С...   Oct 11 2013, 12:11
- - igorle   У нас на фирме приняты правила, совпадающие с НАСА...   Oct 11 2013, 12:12
|- - Сергей Борщ   QUOTE (igorle @ Oct 11 2013, 15:12) У нас...   Oct 11 2013, 13:06
- - Cosmojam   Ок, это я не правильно понял тот абзац из стандарт...   Oct 11 2013, 15:18


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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 17:48
Рейтинг@Mail.ru


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