В С++ стандартная библиотека обернута в пространство имен std
, и программист не должен определять что-либо внутри этого пространства имен. Разумеется, стандарт включает файлы, которые не накладывают друг на друга имена внутри стандартной библиотеки (поэтому никогда не стоит включать стандартный заголовок).
Тогда почему не вся стандартная библиотека включена по умолчанию, а не заставляет программистов писать, например, #include <vector>
каждый раз? Это ускорит компиляцию и, поскольку компиляторы могут начать с предварительно построенной таблицы символов для всех стандартных заголовков.
Предварительно включив все проблемы, можно решить некоторые проблемы с переносимостью: например, если вы включили <map>
, то определили, какие символы приняты в пространстве имен std
, но не гарантируют, что другие стандартные символы не загруженный в него, и, например, вы могли бы (теоретически) оказаться в std::vector
также доступным.
Иногда бывает, что программист забывает включать стандартный заголовок, но программа компилируется в любом случае из-за зависимости конкретной реализации. При перемещении программы в другую среду (или просто другую версию того же самого компилятора) один и тот же исходный код может, однако, прекратить компиляцию.
С технической точки зрения я могу представить компилятору только предварительную загрузку (с помощью mmap
) оптимальной таблицы символов идеального хэша для стандартной библиотеки.
Это нужно делать быстрее, чем загружать и выполнять синтаксический анализ С++ даже одного стандартного файла include и иметь возможность быстрее искать имена std::
. Эти данные также будут доступны только для чтения (таким образом, вероятно, позволяя более компактное представление, а также разделяемое между несколькими экземплярами компилятора).
Тем не менее, они просто должны, поскольку я никогда не реализовал это.
Единственный недостаток, который я вижу, заключается в том, что мы программисты на C++ теряем компиляцию кофе-брейков и посещений: -)
ИЗМЕНИТЬ
Просто чтобы прояснить преимущество main, которое я вижу, для программистов, которые сегодня, несмотря на то, что стандартная библиотека С++ является единственным монолитным пространством имен, должны знать, какая часть (включая файл) содержит функция/класса. Чтобы добавить оскорбление к травме, когда они совершают ошибку, и забыть файл включения, код может компилироваться или нет в зависимости от реализации (что приводит к непереносимым программам).