Бьерн Страуструп - Абстракция данных в языке С++ - Раздельная компиляция

ОГЛАВЛЕНИЕ

 

        Раздельная компиляция

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

  Имена внешних переменных и функций из результирующих объектных файлов
  замыкаются редактором связей, который понятия не имеет о типах
  данных. Редактор связей, который мог бы проверять типы, оказал бы
  неоценимую помощь, и его не так уж трудно было бы подготовить.
      Описание класса определяет тип, так что оно может быть
  включено в несколько исходных файлов без каких-либо нежелательных
  эффектов. Оно должно быть включено в каждый файл, использующий
  класс. Обычно составляющая функция не располагается в том же
  файле, что и описание класса. Язык не имеет никаких предложений
  по поводу расположения составляющих функций.В частности, не
  требуется, чтобы все составляющие функции одного класса были бы в
  одном файле, или были бы отделены от других описаний.
      Так как приватные и публичные части класса физически не
  разделены, приватнаяа часть не является в действительности
  "скрытой от пользователя класса, как если бы это была идеальная
  возможность абстракции данных. Хуже того, любое изменение в
  описании класса может потребовать перекомпиляции всех файлов,
  использующих его. Очевидно, что, если изменения были только в
  приватной части, то перетранслироваться должны были бы только
  файлы, содержащие составляющиеаи дружественные функции.
  (Добавление новых составляющих функций в большинстве случаев не
  делает необходимой перекомпиляцию. Добавление, однако, может
  скрыть некоторую внешнюю функцию, используемую некоторыми другими
  составляющимиа функциями, что поменяет смысл программы.
  сожалению, это редкое событие очень трудно обнаружить.)
  Возможность, которая позволила бы определить множество функций
  (или множество исходных файлов), которые требуется
  перекомпилировать после изменения описания класса, была бы
  чрезвычайно полезной. К несчастью, сделать это весьма
  нетривиально, без того, чтобы значительно неснизить при этом
  скорость компиляции.