Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

X::~X { if (in_a_real_mess) throw Mess; } // никогда так

// не делайте!

Основная причина этого “драконовского” правила заключается в том, что если деструктор сгенерирует исключение (или сам не перехватит исключение) в процессе раскрутки стека, то мы не сможем узнать, какое исключение следует обработать. Целесообразно всеми силами избегать ситуаций, в которых выход из деструктора происходит с помощью генерирования исключения, поскольку не существует систематического способа создания правильного кода, в котором это может произойти. В частности,

если это произойдет, не гарантируется правильная работа ни одной функции или класса из стандартной библиотеки.

A.15. Пространства имен

Пространство имен (namespace) объединяет связанные друг с другом объявления и предотвращает коллизию имен.

int a;

namespace Foo {

int a;

void f(int i)

{

a+= i; // это переменная a из пространства имен Foo

// (Foo::a)

}

}

void f(int);

int main

{

a = 7; // это глобальная переменная a (::a)

f(2); // это глобальная функция f (::f)

Foo::f(3); // это функция f из пространства имен Foo

::f(4); // это глобальная функция f (::f)

}

Имена можно явно уточнять именами их пространств имен (например,

Foo::f(3)
) или оператором разрешения области видимости
::
(например,
::f(2)
), который относится к глобальному пространству имен.

Все имена в пространстве имен (например, в стандартном пространстве

std
) можно сделать доступными с помощью директивы
using namespace std
;

Будьте осторожны с директивой

using
. Удобство, которое она предоставляет, достигается за счет потенциальной коллизии имен. В частности, старайтесь избегать директив
using
в заголовочных файлах. Отдельное имя из пространства имен можно сделать доступным с помощью объявления пространства имен.

using Foo::g;

g(2); // это функция g из пространства имен Foo (Foo::g)

Более подробная информация о пространствах имен содержится в разделе 8.7.

A.16. Альтернативные имена

Для имени можно определить альтернативное имя (alias); иначе говоря, можно определить символическое имя, которое будет означать то же самое, что и имя, с которым оно связано (для большинства случаев употребления этого имени).

typedef int* Pint; // Pint — это указатель на int

namespace Long_library_name { /* ... */ }

namespace Lib = Long_library_name; // Lib — это Long_library_name

int x = 7;

int& r = x; // r —
это x

Ссылки (см. разделы 8.5.5 и A.8.3) — это механизм указания на объекты, работающий на этапе выполнения программы. Ключевые слова

typedef
(см. разделы 20.5 и 27.3.1) и
namespace
относятся к механизмам ссылок на имена, работающим на этапе компиляции. В частности, инструкция
typedef
не вводит новый тип, а просто задает новое имя существующего типа. Рассмотрим пример.

typedef char* Pchar; // Pchar — это имя типа char*

Pchar p = "Idefix"; // OK: p — это указатель типа char*

char* q = p; // OK: p и q — указатели типа char

int x = strlen(p); // OK: p — указатель типа char*

A.17. Директивы препроцессора

Каждая реализация языка C++ содержит препроцессор (preprocessor). В принципе препроцессор работает до компилятора и преобразовывает исходный код, написанный нами, в то, что видит компилятор. В действительности это действие интегрировано в компиляторе и не представляет интереса, за исключением того, что оно может вызывать проблемы. Каждая строка, начинающаяся символом

#
, представляет собой директиву препроцессора.

A.17.1. Директива #include

Мы широко использовали препроцессор для включения заголовочных файлов. Рассмотрим пример.

#include "file.h"

Эта директива приказывает препроцессору включить содержимое файла

file.h
в точку исходного текста, где стоит сама директива. Для стандартных заголовков используются угловые скобки
(<...>
), а не кавычки (
"..."
). Например:

#include<vector>

Это рекомендованная система обозначений для включения стандартных заголовков.

A.17.2. Директива #define

Препроцессор выполняет также определенные манипуляции с символами, которые называются макроподстановками (macro substitution). Например, определим имя символьной строки.

#define FOO bar

Теперь везде, где препроцессор увидит символы

FOO
, они будут заменены символами
bar
.

int FOO = 7;

int FOOL = 9;

В таком случае компилятор увидит следующий текст:

int bar = 7;

int FOOL = 9;

Обратите внимание на то, что препроцессор знает об именах языка С++ достаточно много, чтобы не заменить символы

FOO
, являющиеся частью слова
FOOL
.

Поделиться:
Популярные книги

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Сердце для стража

Каменистый Артем
5. Девятый
Фантастика:
фэнтези
боевая фантастика
9.20
рейтинг книги
Сердце для стража

Жандарм 3

Семин Никита
3. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII

Идеальный мир для Лекаря 5

Сапфир Олег
5. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 5

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар