Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

R.15.6 Специальные функции

Механизм управления особыми ситуациями использует для реакции на ошибки при самой обработке особых ситуаций функции: terminate() и unexpected().

R.15.6.1 Функция terminate()

Иногда от предусмотренной обработки особых ситуаций приходится переходить к более грубым приемам, например: - когда механизм управления особыми ситуациями не смог найти обработчик для запущенной особой ситуации; - когда механизм управления особыми ситуациями столкнулся с нарушенной структурой стека; - когда деструктор, вызванный в процессе раскрутки стека при запуске особой ситуации, сам пытается завершить выполнение программы, запустив особую ситуацию. В этих случаях вызывается функция void terminate(); Она в свою очередь вызывает функцию, которая была указана как параметр при последнем обращении к set_terminate(): typedef void(*PFV)(); PFV set_terminate(PFV); Функция, которая была задана в предыдущем вызове set_terminate(), будет возвращаемым значением текущего вызова. Это помогает пользователю реализовать алгоритм восстановления стека. По умолчанию функция terminate() вызывает abort(). Выбор с помощью terminate() такой функции, которая вместо действительного завершения программы, пытается вернуться в вызвавшую программу, является ошибкой.

R.15.6.2 Функция unexpected()

Если функция, имеющая спецификацию-особой-ситуации, запускает неуказанную особую ситуацию, то вызывается функция void unexpected(); Она в свою очередь вызывает функцию, которая была задана как параметр при последнем обращении к set_unexpected(): typedef void(*PFV)(); PFV set_unexpected(PFV); Функция, которая была задана в предыдущем вызове set_unexpected(), будет возвращаемым значением текущего вызова. Это помогает пользователю реализовать алгоритм восстановления стека. По умолчанию unexpected() вызывает terminate(). Поскольку по умолчанию terminate() вызывает abort(), результатом будет непосредственное и точное обнаружение ошибки.

R.15.7 Особые ситуации и правила доступа

Для формального параметра операции catch действуют такие же правила доступа, как и для формального параметра функции, в которой задана операция catch. При запуске особой ситуации можно указывать такой объект, который можно копировать и уничтожать в области видимости функции, где задана операция throw.

R.16 Препроцессорная обработка

Реализация языка С++ включает препроцессор с возможностями макроподстановки, условной трансляции и включения указанных файлов. Для передачи заданий препроцессору служат строки, начинающиеся с символа # (перед ним могут идти пробелы и символы горизонтальной табуляции). Такие строки называются командами, и их синтаксис определяется независимо от остального языка. Команды могут находиться в любом месте программы, и их действие продолжается (независимо от правил областей видимости С++) до конца данной единицы трансляции ($$R.2). Команду препроцессора, как и любую строку, можно продолжить на следующей строке входного текста, поместив символ обратной дробной черты непосредственно перед символом конца продолжаемой строки. Препроцессор до того, как входная строка будет разбита на лексемы, удаляет символы обратной дробной черты и конца строки. Символ обратной дробной черты не должен быть последним символом входного файла. К лексемам препроцессора относятся: лексемы самого языка ($$R.2.1), имя файла, которое используется в команде #include и вообще любой символ, отличный от обобщенного пробела и несовпадающий ни с какой из лексем препроцессора.