Преимущества заголовочных файлов по сравнению с модулями C++:
- Упрощение компилятора. ru.ruwiki.ru Без заголовочных файлов компилятор и компоновщик делают одну и ту же работу, проверяя, есть ли в модуле откомпилированная функция. ru.ruwiki.ru
- Документация по пользованию модулем. ru.ruwiki.ru Если модуль распространяется уже откомпилированным (библиотека), заголовочный файл будет одновременно документацией по пользованию модулем. ru.ruwiki.ru
- Отсутствие каскадной перекомпиляции. ru.ruwiki.ru Если программист исправил реализацию функции в c-файле, не тронув заголовка, это не вызовет перекомпиляции всех модулей, которые используют данный заголовок. ru.ruwiki.ru
- Возможность задать то, что невозможно задать с помощью модулей. ru.ruwiki.ru Например, подстановки с помощью #define, директивы компилятора, незаконченные синтаксические конструкции. ru.ruwiki.ru
Недостатки заголовочных файлов:
- Медленная компиляция. ru.ruwiki.ru ru.wikipedia.org Чтобы откомпилировать 10 c-файлов, к каждому из которых подключён длинный h-файл, компилятору придётся пройти по заголовку 10 раз. ru.ruwiki.ru
- Тяжеловесные конструкции. ru.ruwiki.ru Заголовочные файлы вместе с некоторыми объектами языка C++ (константы, inline-функции, шаблоны, static-переменные) образуют тяжеловесные конструкции. ru.ruwiki.ru
- Необходимость синхронно менять заголовки функций в двух местах. ru.ruwiki.ru Если изменить c-файл, забыв сделать то же с h-файлом, компоновщик выдаст расплывчатое сообщение об ошибке без номера строки. ru.ruwiki.ru
Преимущества модулей C++:
- Ускорение компиляции. habr.com С модулями компилятор должен выполнить определённый шаг только один раз, независимо от того, сколько раз импортируется модуль. habr.com
- Возможность убрать разделение между интерфейсами и реализациями. habr.com Это может быть полезно, когда разделение файлов необходимо только для ускорения компиляции и не способствует пониманию кода. habr.com
Выбор между заголовочными файлами и модулями зависит от конкретных требований и задач проекта.