Я читаю Herb Sutter More Exceptional C++
и элемент 37 в объявлениях вперед говорит:
Никогда
#include
заголовок, когда будет доступно объявление вперед. Предпочитайте#include
только<iosfwd>
, когда полное определение a поток не требуется.
Кроме того, я слышал много советов по включению только заголовков, необходимых блоку компиляции, чтобы уменьшить зависимости.
Я прекрасно понимаю, почему это должно относиться к заголовкам проекта, но я не совсем понимаю, почему плохо включать ненужные заголовки standard.
Например, я делаю что-то вроде этого:
//standard_library.h
#ifndef STANDARD_LIBRARY
#define STANDARD_LIBRARY
#include <iostream>
#include <chrono>
#include <thread>
...
// Everything I need in the project
#endif
и включать этот единственный заголовок везде, где мне нужно что-то от std
Проблемы, которые я могу себе представить:
- Загрязнение пространства имен с помощью функций библиотеки C, которые не должны находиться в пространстве имен std.
- Более медленное время компиляции
Но у меня не было серьезных проблем с 1. sofar. Почти все в пространстве имен std. Кроме того, я не совсем понимаю, почему 2. обязательно является серьезной проблемой. Стандартные заголовки редко меняются. Кроме того, насколько я знаю, компилятор может прекомпилировать их. Когда дело доходит до шаблонов, они создаются (скомпилированы) только тогда, когда они мне нужны.
Есть также преимущества:
- Меньшая настройка
- Меньше чтения
- Меньше выяснить, какие заголовки мне нужны и в каком заголовке есть определенная функция
Я начинающий программист без опыта работы над крупными проектами, и я искренне хочу это понять, поэтому, пожалуйста, помилуй меня.