На этом шаге мы рассмотрим новые правила именования и использования заголовочных файлов.
Все идентификаторы стандартной библиотеки C++ в процессе стандартизации были объединены в пространство имен std. Изменения несовместимы со старыми заголовочными файлами, в которых идентификаторы стандартной библиотеки C++ объявлялись в глобальной области видимости. Кроме того, в процессе стандартизации изменились некоторые интерфейсы классов (впрочем, проектировщики стремились по возможности сохранить обратную совместимость). Из-за этого пришлось разработать новую схему именования стандартных заголовочных файлов, чтобы для обеспечения совместимости разработчики могли просто включить старые заголовочные файлы.
С определением новых имен для стандартных заголовочных файлов представилась хорошая возможность стандартизировать расширения заголовочных файлов. Раньше на практике использовались разные варианты расширений (например, .h, .hpp и .hxx). Вероятно, спецификации нового стандарта в области заголовочных файлов станут для кого-то неожиданными - теперь стандартные заголовочные файлы вообще не имеют расширений. Команды включения стандартных заголовочных файлов выглядят примерно так:
#include <iostream> #include <string>
Аналогичное правило действует для заголовочных файлов в стандарте С. Теперь заголовочные файлы С снабжаются префиксом с вместо прежнего расширения .h:
#include <cstdlib> // было: <stdlib.h> #include <cstring> // было: <string.h>
В заголовочных файлах все идентификаторы объявляются в пространстве имен std.
Одно из преимуществ новой схемы выбора имен заключается в том, что она позволяет легко отличить старый заголовочный файл для строковых функций char* от стандартного заголовочного файла C++ для работы с классом string:
#include <string> // Класс string языка C++ #include <cstring> // Функции char* языка С
Впрочем, новая схема именования заголовочных файлов вовсе не означает, что файлы стандартных заголовков не имеют расширений с точки зрения операционной системы. Правила обработки команд include для стандартных заголовочных файлов определяются реализацией. Скажем, системы программирования C++ могут добавлять расширения и даже использовать стандартные объявления без загрузки файла. Но на практике большинство систем просто включает заголовок из файла, имя которого точно совпадает с именем, указанным в команде include. Следовательно, в большинстве систем стандартные заголовочные файлы C++ не имеют расширений. Помните, что требование об отсутствии расширения относится только к стандартным заголовочным файлам. В общем случае рекомендуется снабжать заголовочные файлы расширениями, чтобы упростить их идентификацию в файловой системе.
Для сохранения совместимости с С оставлена поддержка "старых" стандартных заголовочных файлов С. Если потребуется, вы можете использовать команду
#include <stdlib.h>
В этом случае идентификаторы объявляются как в глобальной области видимости, так и в пространстве имен std. На практике все выглядит так, словно идентификаторы объявлены в пространстве имен std, после чего была выполнена директива using.
Спецификация заголовочных файлов C++ "старого" формата (например, <iostream.h>) в стандарте отсутствует; кстати, это решение неоднократно менялось в процессе стандартизации. Таким образом, старые заголовочные файлы официально не поддерживаются. Вероятно, на практике большинство поставщиков будут предоставлять их для обратной совместимости. Однако изменения в заголовках не ограничиваются введением пространства имен std, поэтому в общем случае следует либо использовать старые имена заголовочных файлов, либо переключиться на новые стандартизированные имена.
Со следующего шага мы начнем рассматривать обработку ошибок и исключений.