@Hatemylifezxc

Куда с точки зрения структурированности нужно писать #include в .h файлы, или в .cpp?

Допустим есть Header.h файл и соответствующий ему Header.cpp файл с определениями.
Я раньше думал, что наиболее структурированным удобным и понятным код получается если в хедере инклюдить только файлы проекта которые пишуется в ковычках #inlcude "", а в cpp файле единственный инклюд с такими ковычками это соответствющий ему хедер файл с объявлениями. Так человек который читает код может не заглядывая в код реализации, посмотреть Хедер и понять взаимосвязи.
В cpp же файл нужно включать только файлы библиотек #include <>, так при написании реализации если например понадобится std::map вверху файла сразу написать нужный инклюд, плюс в некоторых средах это делается автоматически достаточно написать std::map.
НО допустим в хедере объявляются функции с типами, которые определяются в библиотеке ? Что тогда делать ?
Все равно приходится подключать библиотеки в хедер файле.
Или например бывает удобно показать реализацию некоторых небольших функций прям в хедере.
Получается никак не избавиться от запутанности и инклюды библиотек будут как в хедер так и в cpp файле ?
нужно ли дублировать в таком случае инклюды ?
  • Вопрос задан
  • 619 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Главное, чему нужно следовать при размещении инклюдов - принцип наибольшей закрытости - в *.h файл должно торчать как можно меньше сущностей.

Например, за размещение в *.h файле матюка типа using namespace std; разместившему грозит неприятный разнос на code review c вердиктом УБРАТЬ ДОЛОЙ

Потому что такое размещение приводит к глобальному загаживанию пространства имен с жуткими последствиями.

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

Например, если у вас в классе есть указатель на какой-то другой класс, не нужно тащить инклюд этого класса, достаточно сделать forward declaration.

"Понимать взаимосвязи" позволяет IDE. Там можно прекрасно посмотреть, что куда включено.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы