Ответ 1
Основная причина, по которой люди собирают объект по объекту, - это сэкономить время. Высокоуровневые локализованные изменения кода часто требуют только компиляции одного объекта и релинка, который может быть быстрее. (Компиляция слишком большого количества объектов, которые выводятся в кучи заголовков или избыточно создавать те же шаблоны, на самом деле может быть медленнее, когда изменение общего кода вызывает более полную перекомпиляцию).
Если проект настолько мал, что его можно скомпилировать за 2 секунды, то традиционный подход не принесет значительного эффекта, хотя он делает то, что, как ожидается, может сэкономить время разработчика - например, ваше и наше:-). Балансирование того, что поддержка make файла также требует времени, хотя вы вполне можете это сделать, чтобы в любом случае удобно записывать каталоги, библиотеки, компиляторы и т.д.
Фактические последствия для написанного/сгенерированного кода:
- Файлы cpp обычно сначала включают свои собственные заголовки, что обеспечивает проверку работоспособности, что содержимое заголовка может использоваться независимо другим кодом клиента: объединить все вместе, а пространство имен уже "загрязнено", включая предыдущие файлы заголовков/реализации
- компилятор может оптимизироваться лучше, когда все находится в одной единицы перевода (+1 для комментария leppie, сделайте то же самое...)
- статические не-членные переменные и анонимные пространства имен являются закрытыми для единицы перевода, поэтому включение нескольких cpps означает их совместное использование для улучшения или хуже (+1 для Alexander: -))
- скажем, что файлы cpp определяют функцию или переменную, которая не упоминается в ее заголовке, и может даже быть в анонимном пространстве имен или статическом: код позже в блоке перевода мог бы свободно звонить без необходимости взломать собственную декларацию ( это плохо - если функция должна была вызываться за пределами своего собственного cpp, тогда она должна была быть в заголовке и внешнем экспонале в его объекте единицы перевода).
BTW - на С++ ваши заголовки могут объявлять функции без явного использования ключевого слова extern
, и это нормально для этого.