Программирование >>  Операторы преобразования типа 

1 ... 5 6 7 [ 8 ] 9 10 11 ... 239


Заголовочные файлы 41

В этом случае предыдущая команда записывается так;

cout std::hex 3.4 endl;

О Самый простой вариант - использование директивы using (см. с. 33). После выполнения директивы using для пространства имен std все идентификаторы этого пространства доступны так, как если бы они были объявлены глобально. Например, рассмотрим следующую команду:

using namespace std;

Эта команда позволит использовать такую запись: cout hex 3.4 endl:

Учтите, что в сложных программах это может привести к периодическим конфликтам имен или, что еще хуже, к непредсказуемым последствиям из-за запутанных правил перегрузки. Никогда не используйте директиву using при отсутствии полной информации о контексте (например, в заголовочных файлах, модулях или библиотеках).

Примеры, приводимые в книге, невелики, поэтому для простоты в листингах примеров обычно используется последний вариант.

Заголовочные файлы

Все идентификаторы стандартной библиотеки С++ в процессе стандартизации были объединены в пространство имен std. Изменения несовместимы со старыми заголовочными файлами, в которых идентификаторы стандартной библиотеки С++ объявлялись в глобальной области видимости. Кроме того, в процессе стандартизации изменились некоторые интерфейсы классов (впрочем, проектировщики стремились по возможности сохранить обратную совместимость). Из-за этого пришлось разработать новую схему именования стандартных заголовочных файлов, чтобы для обеспечения совместимости разработчики могли просто включить старые заголовочные файлы.

С определением новых имен для стандартных заголовочных файлов представилась хорошая возможность стандартизировать расширения заголовочных файлов. Раньше на практике использовались разные варианты расширений (например, .h, .hpp и ,hxx). Вероятно, спецификации нового стандарта в области заголовочных файлов станут для кого-то неожиданными - теперь стандартные заголовочные файлы вообще не имеют расширений. Команды включения стандартных заголовочных файлов выглядят примерно так:

Iinclude <1ostream> include <str1ng>

Аналогич1юе правило действует для заголовочных файлов в стандарте С. Теперь заголовочные файлы С снабжаются префиксом с вместо прежнего расширения .h:

#include <cstdl1b> было: <stdlib.h> #1nclude <cstring> было: <string.h>



В заголовочных файлах все идентификаторы объявляются в пространстве имен std.

Одно из преимуществ новой схемы выбора имен заключается в том, что она позволяет легко отличить старый заголовочный файл для строковых функций char* от стандартного заголовочного файла С++ для работы с классом string:

Iinclude <string> Класс string языка С++

Iinclude <cstring> Функции char* языка С

Впрочем, новая схема именования заголовочных файлов вовсе не означает, что файлы стандартных заголовков не имеют расширений с точки зрения операционной системы. Правила обработки команд include для стандартных заголовочных файлов определяются реализацией. Скажем, системы программирования С++ могут добавлять расширения и даже использовать стандартные объявления без загрузки файла. Но на практике большинство систем просто включает заголовок из файла, имя которого точно совпадает с именем, указанным в команде include. Следовательно, в большинстве систем стандартные заголовочные файлы С++ не имеют расширений. Помните, что требование об отсутствии расширения относится только к стандартным заголовочным файлам. В общем случае рекомендуется снабжать заголовочные файлы расширениями, чтобы упростить их идентификацию в файловой системе.

Для сохранения совместимости с С оставлена поддержка старых стандартных заголовочных файлов С. Если потребуется, вы можете использовать команду

Iinclude <stdlib.h>

В этом случае идентификаторы объявляются как в глобальной области видимости, так и в пространстве имен std. На практике все выглядит так, словно идентификаторы объявлены в пространстве имен std, после чего была выполнена директива using (см. с. 33).

Спецификация заголовочных файлов С++ старого формата (например, <iostream.h>) в стандарте отсутствует; кстати, это решение неоднократно менялось в процессе стандартизации. Таким образом, старые заголовочные файлы официально не поддерживаются. Вероятно, на практике большинство поставщиков будут предоставлять их для обратной совместимости. Однако изменения в заголовках не ограничиваются введением пространства имен std, поэтому в общем случае следует либо использовать старые имена заголовочных файлов, либо переключиться на новые стандартизированные имена.

Обработка ошибок и исключений

Стандартная библиотека С++ неоднородна. Она содержит программный код из множества разных источников, отличающихся по стилю проектирования и реализации. Типичным примером таких различий является обработка ошибок и исключений. Одни части библиотеки - например, строковые классы - поддерживают подробную обработку ошибок. Они проверяют все возможные проблемы, которые могут возникнуть в работе программы, и генерируют исключение в случае ошибки. Другие компоненты - например, стандартная библиотека шабло-



нов STL и массивы valarray - оптимизируются по скорости, поэтому они редко проверяют логические ошибки и выдают исключения только в случае ошибок времени выполнения.

Стандартные классы исключений

Все исключения, генерируемые языком или библиотекой, происходят от общего предка - базового класса exception. Этот класс является корнем иерархического дерева исключений, изображенного на рис. 3.1. Стандартные классы исключений делятся на три категории:

О исключения языковой поддержки;

О исключения стандартной библиотеки С++;

О исключения внешних ошибок.

xcaption -

bad alloc

bad cast

bad typeid

logicarror

domain error

i nva 1 id argumen t

lan9th arror

ou t o £ r ang*

los bas ::failure

runtiiM rror

b adaxcapti on

rang arror

overflow arror

underflow error

Рис 3.1. Иерархия стандартных исключений

Классы исключений языковой поддержки

Исключения языковой поддержки используются на уровне языка С++, поэтому их правильнее было бы отнести к базовому языку, нежели к библиотеке. Этн исключения генерируются при неудачных попытках вьшолнения некоторых операций.

О Исключение класса Ьас1 а11ос генерируется при неудачном выполнении глобального оператора new (кроме версии new с запретом исключений). Вероятно, это самое важное исключение, поскольку в любой нетривиальной программе оно может возникнуть в любой момент.

О Исключение класса bad cast генерируется оператором dynamic cast, если преобразование типа по ссылке во время выполнения завершается неудачей. Оператор dynamic cast описан на с. 35.



1 ... 5 6 7 [ 8 ] 9 10 11 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика