На этом шаге мы рассмотрим новые правила именования и использования заголовочных файлов.
Все идентификаторы стандартной библиотеки 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, поэтому в общем случае следует либо
использовать старые имена заголовочных файлов, либо переключиться на новые стандартизированные имена.
Со следующего шага мы начнем рассматривать обработку ошибок и исключений.