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

на главную

Жанры

Программирование. Принципы и практика использования 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. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Я тебя не отпускал

Рам Янка
2. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.55
рейтинг книги
Я тебя не отпускал

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

СД. Том 15

Клеванский Кирилл Сергеевич
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
СД. Том 15

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

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

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Огни Аль-Тура. Завоеванная

Макушева Магда
4. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Аль-Тура. Завоеванная

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3