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

 
 
> 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
Ответов
_Pasha
сообщение Oct 11 2013, 07:01
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Инклюды в хедере - вне добра и зла и их применение диктуется необходимостью минимизации зависимостей между единицами трансляции.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Oct 11 2013, 08:04
Сообщение #3


Ally
******

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



Цитата(_Pasha @ Oct 11 2013, 10:01) *
Инклюды в хедере - вне добра и зла и их применение диктуется необходимостью минимизации зависимостей между единицами трансляции.


Загадочно сказано. wink.gif
О каких зависимостях идет речь?
Допустим весь код уже написан и надо скомпоновать хидеры. Как мы будем тут "минимизировать зависимости"?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2013, 08:17
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AlexandrY @ Oct 11 2013, 11:04) *
Загадочно сказано. wink.gif

Нормально вполне. Подключение заголовочного файла должно тянуть все, что необходимо для этого заголовочного файла и ничего более.
QUOTE (AlexandrY @ Oct 11 2013, 11:04) *
Допустим весь код уже написан и надо скомпоновать хидеры.
А вот это как? Как код может быть написан без заголовочных файлов? Как же он тестировался?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Oct 11 2013, 08:38
Сообщение #5


Ally
******

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



Цитата(Сергей Борщ @ Oct 11 2013, 11:17) *
Нормально вполне. Подключение заголовочного файла должно тянуть все, что необходимо для этого заголовочного файла и ничего более.

А вот это как? Как код может быть написан без заголовочных файлов? Как же он тестировался?


Я вообще-то обсуждаю только крупные проекты.

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

Код не пишется, а компонуется.
Пишется там десяток файлов целевого приложения, меньше процента от общего числа уже созданных исходников.
Хорошая компоновка(не написание!) хидеров значительно сокращает время отладки (которая сопровождается постоянными перекомпиляциями и рефакторингом).

Кстати еще есть такая тема как приватные и публичные хидеры. Не раз такое обнаруживал в разных GUI, FS и проч. Как правило это деление приходится нарушать в процессе портирования. Вот тут просто раздолье для маневров с хидерами.

Но вот про зависимости я не понял.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cosmojam   include в хидере - всё таки это доро или зло?   Oct 10 2013, 22:00
- - AlexandrY   Цитата(Cosmojam @ Oct 11 2013, 01:00) Сущ...   Oct 11 2013, 05:47
|- - halfdoom   Цитата(AlexandrY @ Oct 11 2013, 08:47) В ...   Oct 11 2013, 06:12
|- - demiurg_spb   Немного offtopic... Чтобы не слишком много пережи...   Oct 11 2013, 06:34
- - Сергей Борщ   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
- - 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 Текстовая версия Сейчас: 20th August 2025 - 13:57
Рейтинг@Mail.ru


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