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

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

Жанры

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

Для упрощения проверки согласованности заголовок следует включать как в исходные файлы, использующие объявления, так и в исходные файлы, содержащие определения, соответствующие этим объявлениям. Это позволяет компилятору находить ошибки на самых ранних этапах. Например, представьте себе, что разработчик функции
Token_stream::putback
сделал ошибки.

Token Token_stream::putback(Token t)

{

buffer.push_back(t);

return t;

}

Этот

фрагмент выглядит вполне невинно. К счастью, компилятор перехватывает ошибки, потому что он видит (благодаря директиве
#include
) объявление функции
Token_stream::putback
. Сравнивая это объявление с соответствующим определением, компилятор выясняет, что функция
putback
не должна возвращать объект класса
Token
, а переменная
buffer
имеет тип
Token
, а не
vector<Token>
, так что мы не можем использовать функцию
push_back
. Такие ошибки возникают, когда мы работаем над улучшением кода и вносим изменения, забывая о необходимости согласовывать их с остальной частью программы.

Рассмотрим следующие ошибки:

Token t = ts.gett; // ошибка: нет члена gett

// ...

ts.putback; // ошибка: отсутствует аргумент

Компилятор немедленно выдаст ошибку; заголовок

token.h
предоставляет ему всю информацию, необходимую для проверки.

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

std_lib_facilities.h
содержит объявления стандартных библиотечных средств, таких как
cout
,
vector
и
sqrt
, а также множества простых вспомогательных функций, таких как
error
, не являющихся частью стандартной библиотеки. В разделе 12.8 мы продемонстрируем непосредственное использование заголовочных файлов стандартной библиотеки.

Заголовки обычно включаются во многие исходные файлы. Это значит, что заголовок должен содержать лишь объявления, которые можно дублировать в нескольких файлах (например, объявления функций, классов и числовых констант).

8.4. Область видимости

Область видимости (scope) — это часть текста программы. Каждое имя объявляется в своей области видимости и является действительным (т.е. находится в области видимости), начиная с точки объявления и заканчивая концом данной области. Рассмотрим пример.

void f

{

g; // ошибка: g не принадлежит (пока) области видимости

}

void g

{

f; // OK: функция f находится в области видимости

}

void h

{

int x = y; // ошибка: переменная y не принадлежит (пока)

// области видимости

int y = x; // OK: переменная x находится в области
видимости

g; // OK: функция g находится в области видимости

}

Имена, принадлежащие области видимости, видны из вложенных в нее других областей видимости. Например, вызов функции

f
находится в области видимости функции
g
, которая является вложенной в глобальную область видимости. Глобальная область видимости не вкладываются ни в какую другую. Правило, утверждающее, что имя должно быть объявлено до того, как будет использовано, по-прежнему действует, поэтому функция
f
не может вызывать функцию
g
.

Существует несколько разновидностей областей видимости, которые можно использовать для управления используемыми именами.

Глобальная область видимости (global scope). Часть текста, не входящая ни в одну другую область видимости.

Пространство имен (namespace scope). Именованная область видимости, вложенная в глобальную область видимости или другое пространство имен (раздел 8.7).

Область видимости класса (class scope). Часть текста, находящаяся в классе (раздел 9.2).

• Локальная область видимости (local scope). Часть текста, заключенная в фигурные скобки, { ... }, в блоке или функции.

• Область видимости инструкции (например, в цикле

for
).

Основное предназначение области видимости — сохранить локальность имен, чтобы они не пересекались с именами, объявленными в другом месте. Рассмотрим пример.

void f(int x) // функция f является глобальной;

// переменная x является локальной в функции f

{

int z = x+7; // переменная z является локальной

}

int g(int x) // переменная g является глобальной;

// переменная x является локальной в функции g

{

int f = x+2; // переменная f является локальной

return 2*f;

}

Изобразим это графически.

Здесь переменная

x
, объявленная в функции
f
, отличается от переменной
x
, объявленной в функции
g
. Они не создают недоразумений, потому что принадлежат разным областям видимости: переменная
x
, объявленная в функции
f
, не видна извне функции
f
, а переменная
x
, объявленная в функции
g
, не видна извне функции
g
. Два противоречащих друг другу объявления в одной и той же области видимости создают коллизию (clash). Аналогично, переменная
f
объявлена и используется в функции
g
и (очевидно) не является функцией
f
.

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

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

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

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

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

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5