Какой подход лучше в подключенни файлов для translation units?
Проблема
Хочу найти оптимальное решение проблемы подключения headers в translation units. И на данный момент, стою между двумя способами, которые мне известны:
1. Подключать .h только в .cpp
Плюсы:
- Обособление объявления (
.h) от реализации (.cpp) со всеми её зависимостями - Устранение возможности, когда
headersначинают подключать друг друга по цепочке
Минусы:
- Каждый раз, когда мы подключаем
.hмы должны также подключать другие.hот которых он зависит.
Например, у нас есть класс GameState. Он объявлен в GameState.h и реализован в GameState.cpp, где подключаются его зависимости, например: State.h, Entity.h.
Мы подключаем GameState.h в какой-нибудь другой .cpp и для него же и вместе с ним должны подключить его зависимости, то есть State.h и Entity.h.
Получается вместо одного #include "GameState.h" мы получем:
#include "State.h"
#include "Entity.h"
#include "GameState.h"
2. Подключать .h зависимости в реализуемый .h
Плюсы и минусы -> зеркальное отражение "плюсов и минусов" способа выше.
Вопрос
Так какой способ будет лучше? Есть ли ещё какие-либо другие способы наиболее эффективно организовать этот процесс?
P.S. Про модули C++20 знаю, но пока что не использую, так как большинство компиляторов поддерживают эту фичу только как экспериментальную. Но, если вы просто поднимите этот вопрос то, думаю, это только лишь обогатит обсуждение.