Какой подход лучше в подключенни файлов для 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 знаю, но пока что не использую, так как большинство компиляторов поддерживают эту фичу только как экспериментальную. Но, если вы просто поднимите этот вопрос то, думаю, это только лишь обогатит обсуждение.


Ответы (0 шт):