Проблема с заголовками отдельных файлов подробно объяснена доктором Доббсом , экспертом по написанию компиляторов. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ОДИН ФАЙЛ ФАЙЛА !!! Каждый раз, когда заголовок включается в файл .cc / .cpp, его необходимо перекомпилировать, поскольку вы можете передать макросы файла для изменения скомпилированного заголовка. По этой причине один заголовочный файл значительно увеличит время компиляции без каких-либо преимуществ. С C ++ вы должны сначала оптимизировать для человеческого времени, а время компиляции - человеческое время. Вы никогда не должны, потому что это значительно увеличивает время компиляции, включает в себя больше, чем нужно для компиляции в любом заголовке, каждый модуль перевода (TU) должен иметь свой собственный файл реализации (.cc / .cpp), и каждый TU, названный с уникальными именами файлов; .
За десятилетие опыта разработки C ++ SDK я ВСЕГДА имею три файла в модуле EVERY . У меня есть config.h
, который включается в почти каждого заголовочного файла, который содержит предварительные требования для всего модуля, такого как platform-config и stdint.h
. У меня также есть файл global.h
, который включает в себя все файлы заголовков в модуле; этот в основном предназначен для отладки ( подсказка перечислите ваши швы в файле global.h
для лучшей проверки и упрощения отладки кода ). Ключевой отсутствующий фрагмент здесь заключается в том, что у вас действительно должен быть public.h
файл, который включает ONLY ваш публичный API.
В библиотеках, которые плохо запрограммированы, таких как boost и их отвратительные имена классов lower_snake_case, они используют этот недоделанный наихудший метод использования detail
(иногда называемого 'impl') шаблона проектирования папок, чтобы "скрыть" свои частные интерфейс. Существует длинная предыстория того, почему это наихудшая практика, но короткая история заключается в том, что она создает избыточную типизацию INSANE , которая превращает однострочные в многострочные, и это не соответствует UML, и это портит диаграмму зависимостей UML, что приводит к чрезмерно сложному коду и противоречивым шаблонам проектирования, например, дети на самом деле являются родителями и наоборот. Вы не хотите или не нуждаетесь в папке detail
, вам нужно использовать заголовок public.h
с набором родственных модулей БЕЗ ДОПОЛНИТЕЛЬНЫХ ИМЕННЫХ ИМЕН , где ваш detail
является братом, а не ребенком, который находится в реатлии родителя. Предполагается, что пространства имен предназначены только для одной цели: для сопряжения вашего кода с кодом других людей, но если это ваш код, вы управляете им, и вам следует использовать уникальные имена классов и функций, потому что это плохая практика, когда вы используете не нужно, потому что это может привести к коллизии хеш-таблицы, что замедлит процесс компиляции. UML - лучшая практика, поэтому, если вы можете организовать заголовки так, чтобы они были совместимы с UML, тогда ваш код по определению является более надежным и переносимым. Файл public.h
- это все, что вам нужно для предоставления только публичного API; спасибо.