Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
Основная причина этого “драконовского” правила заключается в том, что если деструктор сгенерирует исключение (или сам не перехватит исключение) в процессе раскрутки стека, то мы не сможем узнать, какое исключение следует обработать. Целесообразно всеми силами избегать ситуаций, в которых выход из деструктора происходит с помощью генерирования исключения, поскольку не существует систематического способа создания правильного кода, в котором это может произойти. В частности,
A.15. Пространства имен
Пространство имен (namespace) объединяет связанные друг с другом объявления и предотвращает коллизию имен.
Имена можно явно уточнять именами их пространств имен (например,
Все имена в пространстве имен (например, в стандартном пространстве
Будьте осторожны с директивой
Более подробная информация о пространствах имен содержится в разделе 8.7.
A.16. Альтернативные имена
Для имени можно определить альтернативное имя (alias); иначе говоря, можно определить символическое имя, которое будет означать то же самое, что и имя, с которым оно связано (для большинства случаев употребления этого имени).
Ссылки (см. разделы 8.5.5 и A.8.3) — это механизм указания на объекты, работающий на этапе выполнения программы. Ключевые слова
A.17. Директивы препроцессора
Каждая реализация языка C++ содержит препроцессор (preprocessor). В принципе препроцессор работает до компилятора и преобразовывает исходный код, написанный нами, в то, что видит компилятор. В действительности это действие интегрировано в компиляторе и не представляет интереса, за исключением того, что оно может вызывать проблемы. Каждая строка, начинающаяся символом
A.17.1. Директива #include
Мы широко использовали препроцессор для включения заголовочных файлов. Рассмотрим пример.
Эта директива приказывает препроцессору включить содержимое файла
Это рекомендованная система обозначений для включения стандартных заголовков.
A.17.2. Директива #define
Препроцессор выполняет также определенные манипуляции с символами, которые называются макроподстановками (macro substitution). Например, определим имя символьной строки.
Теперь везде, где препроцессор увидит символы
В таком случае компилятор увидит следующий текст:
Обратите внимание на то, что препроцессор знает об именах языка С++ достаточно много, чтобы не заменить символы