КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

Turbo C++ Version 1.0 Programmer’s Guide

Комментировать

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

i = 3.0e3; // double i в контексте и видима
// int i в контексте, но скрыта
ch = ‘A’; // char ch в контексте и видима
*)
// double i вне контекста
i += 1; // int i видима и равна 4
… // char ch все еще в контексте и видима
// и равна ‘A’
*)
… // int i и char ch вне контекста

И снова, специальные правила действуют в отношение
скрытых имен классов и имен компонентов классов: специальные
операции С++ позволяют доступ к скрытымидентификаторам при
определенных условиях (см. стр.103 оригинала).

Продолжительность

Продолжительность, близко связаннаяс классом памяти,
определяет продолжительность периода, в течение которого
объявленным идентификаторам соответствуют распределенные в
памяти реальные физические объекты. Такжеделается различие
между объектами времени компиляции и времени выполнения.
Например, переменным, в отличие от определяемых типов
(typedefs) и типов, память непосредственно во время выполне-
ния не распределяется. Существует три вида продолжительнос-
ти: статическая, локальная и динамическая.

Статическая продолжительность (static)

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

— 32 —

При отсутствии явного инициализатора, либо вС++ конс-
труктора, объекты со статической продолжительностью инициа-
лизируются в ноль (или пустое значение).

Статическую продолжительность не следует путать с фай-
ловым или глобальным контекстом. Объектможетиметьстатическую
продолжительность и при этом локальный контекст.

Локальная продолжительность (local)

Объект с локальной продолжительностью всегда имеет ло-
кальный контекст, поскольку он не существует вне своего объ-
емлющего блока. Обратное неверно: объект слокальным контекс-
том может иметь статическую продолжительность.

Объектыс локальнойпродолжительностью жизни, иначе
называемые динамическими локальнымипеременными, менее надеж-
ны. Они создаются в стеке (или в регистре) при входе в объ-
емлющий их блок или функцию. При выходе программы из такого
блока или функции они уничтожаются. Объекты с локальной про-
должительностью должны быть инициализированы явно;в против-
ном случае их исходное содержимое непредсказуемо. Объекты с
локальной продолжительностью всегда должны иметь локальный
контекст или контекст функции.При объявлении переменных ло-
кальной продолжительности можно использовать спецификатор
класса памяти auto, однако он является избыточным, поскольку
auto для переменных, объявленных в блоке, всегда является
умолчанием.

При объявлении переменных (например, int, char, float)
спецификатор класса памяти register такжеподразумевает auto,
однако компилятору при этом передается запрос (или рекомен-
дация) о том, что при возможности данный объект желательно
разместить в регистре. Turbo C++можно установить таким обра-
зом, чтобы он распределял регистрлокальной интегральной пе-
ременнойили переменной типа указатель, если какой-либо ре-
гистр свободен. Если свободных регистров нет, то переменная
распределяется как auto, или динамический локальный объект,
без выдачи предупреждения или генерации ошибки.

Динамическая продолжительность (dynamic)

Объекты с динамической продолжительностью жизни созда-
ются и разрушаются конкретными вызовами функций при выполне-
нии программы. Им распределяется памятьиз специального ре-
зерва памяти, называемого кучей, при помощи либо стандартных
библиотечных функций, какнапример malloc, либо при помощи
операции С++ new. Соответствующая отмена распределения вы-
полняется при помощи free или delete.

Единицы трансляции

Термин единица трансляции относится к файлу исходного
кода вместе с включаемыми файлами, но безисходных строк,
опущенных условными директивами препроцессора. Синтаксически
единица трансляции определяется как последовательность внеш-
них объявлений:

единица-трансляции:
внешнее-объявление
единица-трансляции внешнее-объявление

внешнее-объявление:
определение-функции
объявление

— 33 —
Слово external имеет в С несколько значений; в данном
случае оно относится к объявлениям, находящимся вне ка-
ких-либо функций, и которые, следовательно, имеют контекст
файла. (Отдельным свойством является внешний тип компоновки;
см.следующий раздел, «Компоновка».) Любое объявление, также
резервирующее память для объекта или функции, называется оп-
ределением (или объявлением определения). Более подробную
информацию см. в разделе «Внешние объявления и определения»
на стр.36 оригинала.

Компоновка

Выполняемая программа обычно создается компиляцией нес-
кольких независимых единиц трансляции, а затем компоновкой
получившихся объектных файлов с уже существующими библиоте-
ками. Проблема возникает, когда один и тот же идентификатор
объявлен в разных контекстах (например, в различных файлах),
либо объявлен более одного раза в одном и том же контексте.
Компоновка это процесс, который позволяетправильно связать-
каждое вхождение идентификатора с одним конкретным объектом
или функцией. Все идентификаторы имеют один из трех атрибу-
товкомпоновки, тесно связанных с их контекстом: внешняя ком-
поновка, внутренняя компоновка или отсутствие компоновки.
Эти атрибуты определяются местоположением и форматом объяв-
лений, а также явным (или неявным по умолчанию) использова-
нием спецификатора класса памяти static или extern.

Каждое вхождение конкретного идентификатора с типом
компоновки external представляет тот же самый объект или
функцию во всем множестве файлов и библиотек, составляющих
программу. Каждое вхождение конкретного идентификатора с ти-
пом компоновки internal представляет тот же самый объект или
функцию только в пределах одного файла. Идентификаторы с ти-
пом компоновки no (отсутствие) представляет уникальные эле-
менты программы.

Ниже приводятсяправила внешней (external) и внутренней
(internal) компоновки:

1. Любой идентификатор объекта или файла, имеющий фай-
ловый контекст, будет иметь внутренний тип компоновки, если
его объявление содержит спецификатор класса памяти static.

Для С, если один и тот же идентификатор в пределах од-
ного файла появляется и с внутренним, и с внешним типом ком-
поновки, то идентификатор будет иметь внутренний тип компо-
новки.

2. Если объявление идентификатора объекта или функции
содержит спецификатор класса памяти extern, то идентификатор
имеет тот же тип компоновки, что и видимое объявление иден-
тификатора с файловым контекстом. Если такого видимого объ-
явления не имеется, то идентификатор будет иметь внешний тип
компоновки.

3. Если функция объявлена без спецификатора класса па-
мяти, то ее тип компоновки определяется, как если бы был ис-
пользован спецификатор класса памяти extern.

4. Если идентификатор объекта с файловым контекстом
объявлен без спецификатора класса памяти, то идентификатор
имеет внешний тип компоновки.

Следующие идентификаторы не имеют атрибута типа компо-
новки:

1. Любой идентификатор, объявленный иначе, чем объект

— 34 —
или функция (например, идентификатор typedef).

2. Параметры функции.

3. Идентификаторы с контекстом блока в случае объектов,
объявленных без спецификатора класса памяти extern.

Синтаксис объявления

Все шесть взаимосвязанных атрибута (класс памяти, тип,
контекст, видимость,продолжительность и тип компоновки) мо-
гут быть разными способами определены при помощи объявлений.

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *