Несколько причин:
(1) Время инкрементной сборки
Когда проекты становятся больше, управление временем сборки проблематично, особенно для проектов C ++. Строительство 1 или 5 минут после незначительного изменения имеет большое значение. Это подчеркивается большинством изменений в крупных проектах, поскольку и требуют большого тестирования. Добавьте к этому любые попытки TDD и рефакторинга, и вы - мертвый слизень с сицилийской обувью.
Разделение на заголовок и тело и перемещение его в библиотеки значительно увеличивает время инкрементной сборки.
(2) Статика
Для многих вещей вам нужен один экземпляр типа, т.е.
// .cpp
static Foo foo;
Нет способа (который я знаю) разрешить это в проекте только для заголовков. Решения для конкретных компиляторов ограничены, например, __declspec(selectany)
в MSVC ограничен типами POD.
[edit] C ++ 17 теперь позволяет использовать inline также для инициализации переменных, так что это больше не проблема блокировки.
(3) Сокрытие реализации
Разделение .cpp / .h - единственный способ четко отделить открытый интерфейс от деталей реализации. Вы можете бросить учеников в секцию private
, но это не работает для других сущностей.
(Даже разделение заголовка и тела является утечкой, если вы не добавите дополнительные методы, такие как PIMPL, так что этот аргумент немного слаб IMO, но, опять же, в большом проекте я бы очень упустил этот эффективный, если несовершенный метод).
В любом случае, отличный вопрос - вы поняли, что есть что-то не так с моделью сборки C / C ++, которую я считаю древним пережитком ужасных последствий.
Вы должны попробовать, насколько далеко вы можете протолкнуть модель «только заголовки» (или, по крайней мере, «почти только заголовки», чтобы учесть статику). Вы можете получить довольно далеко - также было бы интересно услышать от людей, которые пытались.
Возможно, стоит попробовать использовать статические библиотеки для разделения и инкапсуляции реализаций, а в остальном держать весь код в заголовках. Я вижу некоторые проблемы с этим, но это значит, что наш текущий способ работы без проблем.