Шаг 44.
Библиотека STL.
Заголовочные файлы

    На этом шаге мы рассмотрим новые правила именования и использования заголовочных файлов.

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

    Со следующего шага мы начнем рассматривать обработку ошибок и исключений.




Предыдущий шаг Содержание Следующий шаг