Требуется некоторая языковая поддержка (в противном случае компиляторы C / C ++ сделали бы это тоже)
В частности, требуется, чтобы компилятор генерировал автономные модули, которые предоставляют метаданные, на которые другие модули могут ссылаться, чтобы вызывать их.
.NET сборки являются простым примером. Все файлы в проекте скомпилированы вместе, генерируя одну DLL. Эта dll может быть запрошена .NET для определения, какие типы она содержит, так что другие сборки могут вызывать функции, определенные в ней.
И чтобы использовать это, на языке должно быть разрешено ссылаться на другие модули.
В C ++, что определяет границу модуля? Язык указывает, что компилятор рассматривает данные только в своем текущем модуле компиляции (файл .cpp + включенные заголовки). Не существует механизма для указания «я бы хотел вызвать функцию Foo в модуле Bar, даже если у меня нет прототипа или чего-либо еще для него во время компиляции». Единственный механизм для обмена информацией о типах между файлами - с помощью: includes.
Есть предложение добавить систему модулей в C ++, но она не будет в C ++ 0x. В последний раз я видел, что план состоял в том, чтобы рассмотреть его для TR1 после 0x.
(Стоит отметить, что система #include в C / C ++ изначально использовалась, потому что она ускорила бы компиляцию . Еще в 70-х годах она позволяла компилятору обрабатывать код в простой линейной форме. Сканирование. Ему не нужно было строить деревья синтаксиса или другие подобные «расширенные» функции. Сегодня таблицы перевернулись и стали огромным узким местом как с точки зрения удобства использования, так и с точки зрения скорости компиляции.)