Рубрики: КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

про компютерное железо, документация, языки программирования

Turbo C++ Version 1.0 Programmer’s Guide

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

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

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

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

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

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

— 29 —
Именующие выражения (Lvalues)

Именующее выражение представляет собой локатор объекта,
выражение, которое обозначает объект. Примером именующего
выражения может служить *P, где P это выражение, дающее не-
пустой указатель. Модифицируемое именующее выражение -это
идентифицирующее выражение, относящееся к объекту, к которо-
му возможен доступ и допустимо его изменение в памяти. Ука-
затель константы const, например, не является модифицируемым
именующим выражением. Указатель на константуможетбыть изме-
нен (а подлежащее обращению по этому указателю значение — не
может).

Исторически в слове Lvalues буква L означает «левый»;
это означает, что Lvalue допускается в левой части (априни-
мающей части) оператора присваивания. Здесь в левой части
оператора присваивания допустимы только модифицируемые име-
нующие выражения. Например, если a и b — это не являющиеся
константами целочисленные идентификаторы с правильно распре-
деленнымидля них областями памяти, тооба они являются моди-
фицируемыми именующими выражениями, и присваиваниятипа a =
1;и b = a + b; вполне допустимы.

Значения переменной (Rvalues)

Выражение a + b не можетявляться именующим выражением,
и выражение типа a + b = a недопустимо, поскольку выражение
в левой части не относится кобъекту. Такие выражения часто
называют значением переменной (значение правой части выраже-
ния).

Типы и классы памяти

Для связи идентификаторов с объектами требуется, чтобы
каждый идентификаторимел как минимум два атрибута: класс па-
мяти и тип (иногда его называют типомданных). Компиля-
торTurboC++ определяет эти атрибуты появным или неявным объ-
явлениям в исходном коде программы.

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

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

Контекст

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

— 30 —
Контекст блока

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

Контекст функции

Единственными идентификаторами, имеющими контекст типа
функции, являются метки операторов. Именаметок могут быть
использованыв операторах goto влюбой точке функции,где объ-
явлена данная метка. Метки объявляютсянеявно; для этого за-
писывается имя_метки: и за ним оператор. Имена меток в пре-
делах функции должны быть уникальными.

Контекст прототипа функции

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

Контекст файла

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

Контекст класса (С++)

Классом можно считать именованный набор компонентов,
включая сюда структуры данных и действующие с ними функции.
Контекст класса относится, за некоторыми исключениями, к
именам компонентов конкретного класса. Классы и ихобъекты
имеют множество специальных правил доступа и определения
контекста; см. стр. 102 — 113 оригинала.

Контекст и пространства имен

Пространство имен — это контекст, в пределах которого
идентификатордолженбыть уникальным. В С существует четыре
раздельных класса идентификаторов:

1. Имена меток операторов goto. Эти имена должны быть
уникальными в пределах функции, в которой они объявлены.

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

В С++ структуры, классы и перечислимые данные относятся
к одному и тому же пространству имен.

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

4. Переменные, определения типа и компоненты перечисли-
мых данных. Они должны бытьуникальными вконтексте, где они
определены. Идентификаторы, объявленные внешними, должны
быть уникальными среди переменных, объявленных вовне.

— 31 —

Видимость

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

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

Видимость не может выходить за пределы контекста; но
контекст может превышать видимость.


(*
int i; char ch; // автоматическое распределение по
умолчанию
i = 3; // int i и char ch в контексте и видимы

(*
double i;

Страницы: 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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

int p(int,long) /* Функция с типомвозврата int,принима-
ющая два параметра, первый типа int, и второй типа long */

int pascal q(void); /* функция типа pascal, возвращаю-
щая int и не принимающая параметров */

char far *s(char *source, int kind); /* Функция,
возвращающая дальний указатель на char и принимающая два па-
раметра: превый — дальний указатель на char, а второй int */

int printf(char *format,…); /* Функция, возвращающая
int и принимающая фиксированный параметр типа указатель на
char и любое число дополнительных параметров неизвестного
типа */

int (*fp)(int); /* Указатель на функцию, возвращающую
int и принимающую один параметр int */

Объявления

Общий синтаксис для определений внешних функций приво-
дится в следующей таблице:

Определения внешних функций Таблица 1.18
————————————————————
файл:
внешнее-определение
файл внешнее-определение

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

определение-функции:
декларатор
составной-оператор
————————————————————

В целом, определение функции состоит из следующих раз-
делов (грамматика позволяет создание и более сложных конс-
трукций):

— 61 —
1. Опциональные спецификаторы класса памяти: extern или
static. Умолчанием является extern.

2. Тип возврата, возможно void. Умолчанием является
int.

Элементы из пунктов 1 и 2 можно взаимно комбинировать.

3. Опциональные модификаторы: pascal, cdecl, interrupt,
near, far, huge. Умолчание зависит от модели памяти и уста-
новленных опций компилятора.

4. Имя функции.

5. Список объявления параметров, который может быть
пустым, заключенный в круглые скобки. В с предпочтительно
обозначать отсутствие параметров записью func(void). В С до-
пускается и старый стиль записи func(), но это может приво-
дить к неоднозначностям и возможным ошибкам. В С++ выдается
соответствующее предупреждение.

6. Тело функции, представляющее собой коды, выполняемые
при вызове функции.

Объявления формальных параметров

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

int func(void) (* // аргументы отсутствуют

С++int func(T! t1, T2 t2, T3 t3=1) (*
// три простых параметра,
// один из которых с аргументо
// по умолчанию

C++int func(T1* ptr1, T2& tref) (*
// аргументы указатель и ссылк

int func(register int i) (* // запрос регистра для аргумен

int func(char *str,…) (* /* один строковый аргумент ипе-
ременное число прочих аргументов, либо фиксирован-
ное число аргументов с переменными типами */

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

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

Все объявленные параметры автоматически получают контекст, а
также длительность данной функции. Единственным допустимым
для них классом спецификатора является register.

В деклараторах формальных параметров могут использоваться
модификаторы const и volatile.

Вызовы функций и преобразования аргументов

— 62 —

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

Ниже приводится краткое изложение правил, управляющих
обработкой в Turbo C++ модификаторов языка и формальных па-
раметров при вызове функций, как при наличии прототипа, так
и при его отсутствии:

1. Модификаторы языка для определения функции должны соот-
ветствовать модификаторам, используемым в объявлении функ-
ции, при всех вызовах функции.

2. Функция может модифицировать значения своих формальных
параметров, но это не влияет на фактические аргументы в вы-
зывающей программе, за исключением аргументов типа ссылка в
C++.

Если ранее не был объявлен прототип функции, Turbo C++ пре-
образует интегральные аргументы при вызове функции в соот-
ветствии с правилами интегрального расширения, описанными в
разделе «Стандартные преобразования» на стр.41 оригинала.
При наличии в контексте прототипа функции Turbo C++ преобра-
зует данные аргументы к объявленным типам параметров, как
при операции присвоения.

Если прототип функции включает в себя многоточие (…), то
Turbo C++ преобразует все данные аргументы функции, как и в
любом другом прототипе (использующем многоточие). Компилятор
расширяет любые аргументы, заданные помимо фиксированных па-
раметров, по обычным правилам для аргументов функции без
прототипов.

При наличии прототипа число аргументов в прототипе и
функции должно совпадать (при условии, что в прототипе не
задано многоточие).Типы аргументов должны являться совмести-
мы в такой степени, чтобы операция присвоения выполнялась
правильно. Вы всегда можете использовать явные приведения,
чтобы преобразовать аргумент к типу, приемлемому для прото-
типа функции.

Важное замечание

Если прототип функции не соответствует фактическому оп-
ределению функции, Turbo C++ обнаружит это в том и том слу-
чае, когда определение содержится в той же единице
компиляции, что и прототип. При создании библиотеки подпрог-
рамм с соответствующим файлом заголовкапрототипов незабывай-
те включать этот файл при компиляции библиотеки, с тем, что-
бы любые расхождения между прототипом и фактическими
определениями функции были обнаружены. С++ обеспечивает при
компоновке контроль типов, поэтому все различия между ожида-
емыми и действительно заданными параметрами будут компонов-
щиком обнаружены.

Структуры

Инициализация структуры описана на стр.42 оригинала.

Структура — это производный тип данных, обычно предс-
тавляющий собой определяемый пользователем набор именованных
компонентов. Эти компоненты могут быть любого типа, как фун-
даментального, так и производного (с некоторыми описываемыми

— 63 —
далее ограничениями), и располагаться в любой последователь-
ности. Кроме того, компонент структуры может иметь тип бито-
вого поля, более нигде не разрешаемого. Тип струтуры в Turbo
C++ позволяет обрабатывать сложные структуры данных так же
легко, как и простые переменные.

В С++ тип структуры рассматривается как тип класса (с
определенными различиями: доступ по умолчанию устанавливает-
ся public, а умолчание для базового класса также public).
Это позволяет организовывать более сложное управление компо-
нентами структуры при помощи спецификаторов доступа С++:
public (это умолчание), private и protected. Помимо данного
опционального механизма управления доступом и упомянутых ис-
ключений, далее рассматриваемые синтаксис и применение
структур относятся равно к структурам С и С++.

Объявление структур выполняется при помощи ключевого

Страницы: 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

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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

слова struct. Например,

struct mystruct (* … *); // mystruct — это тег струк-
туры

struct mystruct s, *ps, arrs[10];
/* s имеет тип структуры mystruct; ps это указатель на
тип struct mystruct */
Структуры без тегов и определения типов (typedef)

Структуры без компонентов и компоненты объединений при
инициализации игнорируются.

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

struct (* …*) s, *ps, arrs[10]; //структура без тега

При объявлении структуры, как с тегом, так и без него,
можно создать typedef:

typedef struct mystruct (* … *) MYSTRUCT;
MYSTRUCT s, *ps, arrs[10]; // то же, что и
// struct mystruct s и т.д.
typedef struct (* … *) YRSTRUCT; // тег отсутствует
YRSTRUCT y, *yp, arry[20];

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

Объявления компонентов структуры

Список-объявления-компонентов вфигурных скобках объяв-
ляет типы и имена компонентов структуры при помощи синтакси-
са декларатора, показанного в таблице 1.11 на стр.36
оригинала.

Компоненты структуры могут быть любого типа, за двумя
исключениями

1. Тип компонента не может быть тот же, что и объявляе-
мая в текущий момент структура:

struct mystruct (* mystruct s *) s1, s2;// недопустимо

Компонент структуры может являться указателем на объяв-

— 64 —
ляемую структуру, как в следующем примере:

struct mystruct (* mystruct *ps *) s1, s2; // так можно

Кроме того, структура может содержать ранее объявленные
типы структур, объявляя вхождения объявленных ранее струк-
тур.

В С++ ключевое слово struct может быть опущено.

2. Кроме С++, компонент структуры нигде не может иметь
тип «функция, возвращающая …», но тип «указатель на функ-
цию, возвращающую …» допустим. В С++ struct может иметь
компоненты-функции.

Структуры и функции

Функция может иметь возвращаемое значение типа структу-
ры или указателя структуры.

mystruct func1(void); // func1() возвращает структуру
mystruct
*func29void); // func2() возвращает указатель структуры

Структура можетбыть передана функции в качестве аргу-
мента, следующим образом:

void func1 (mystruct s); // непосредственно
void func2 (mystruct *sptr); // через указатель
void func3 (mystruct &sref); // по ссылке (только С++)
Доступ к компоненту структуры

Доступ к компонентам структур и объединений выполняется
операторами выбора . и ->. Предположим, что объект имеет тип
структуры S, а sptr это указатель на S. Тогда, если m это
идентификатор типа M, объявленного в S, то выражения s.m и
sptr->m имеют тип M и представляют объект m — компонент
структуры s. Выражение s->sptr является удобным синонимом (*
sptr).m.

Операция . называется прямым селектором компонента
структуры; операция -> называется косвенным селектором ком-
понента (или указателем) структуры; например,

struct mystruct (*

int i;
char str[21];
double d;
*) s, *sptr=&s;

s.i = 3; // присвоению члему i структуры mystruct s
sptr->d = 1.23; // присвоение компоненту d структуры
mystruct s

Выражение s.m является именуемым значением (lvalue),
если s это не именуемое значение и s не имеет тип массива.
Выражение sptr->m является именуемым выражением, если m не
имеет тип массива.
Если структура B содержит поле, тип которого есть
структура A, то доступ к компонентам A выполняется через два
одновременно задаваемых селектора компонента структуры:

— 65 —

struct A (*
int j;
double x;
*)

struct B (*
int i;
struct A a;
double d;
*) s, *sptr;

s.i = 3; // присвоение компоненту i структуры B s.a.j =
2; // присвоение компоненту j структуры A sptr->d = 1.23; //
присвоение компоненту d структуры B (sptr->).x = 3.14 //
присвоение компоненту x структуры A

Каждое объявление структуры вводит уникальный тип
структуры, поэтому в

struct A (*
int i,j;
double d;
*) a, a1;

struct B (*
int i,j;
double d;
*) b;

объекты a и a1 оба имеют тип struct A, но объекты a и b
имеют различные типы структуры. Структурам может выполняться
присваивание только в том случае, если и исходная структура,
и структура назначения имеют один и тот же тип:

a = a1;// так можно; тип один и тот же, поэтому может
быть // выполнено покомпонентное присвоение структур
a = b;// так нельзя; разные компоненты
a.1 = b.1; a.j = b.j; a.d = b.d; // однако присвоение
можно // выполнять на уровне компонентов структуры

Выравнивание по границе слова

Память распределяется структуре покомпонентно, сле-
ва-направо, от младшего к старшему адресу памяти. В следую-
щем примере

struct mystruct (*
int i;
char str[2];

double d;
*) s;

объект s занимает достаточное количество памяти для
размещения 2- байтового целочисленного значения, 21-байтовой
строки и 8-байтового значения типа double. Формат данного
объекта в памяти определяется опцией Turbo C++ выравнивания
по границе слова. Когда эта опция выключена (по умолчанию),
s будет занимать 31 байт непрерывно. Если же включить вырав-
нивание по границе слова опцией -a компилятора (или в диало-
говом поле Options \! Compiler \! Code Generation), то Turbo
C++ заполняет структуры байтами таким образом, что структура
была выравнена по следующим правилам:

— 66 —
1. Структура должна начинаться по границе слова (четный
адрес).

2. Любой не-символьный элемент будет иметь четное сме-
щение в байтах относительно начала структуры.

3. В конец структуры при необходимости добавляется ко-
нечный байт, таким образом, чтобы вся структура в целом за-
нимала четное количество байтов.

Страницы: 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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

TURBO C++

Version 1.0

Programmer’s Guide

.
— 2 —

Оглавление

Введение……………………………………………
Содержание данного руководства……………………….
Глава 1 Стандарт языка Turbo C++……………….
Синтаксис и терминология…………………………….
Грамматические правила структуры фраз и лексики языка…..
Пробельные символы………………………………….
«Склеивание» строк символом \………………………
Комментарии………………………………………..
Комментарии C…………………………………….
Вложенные комментарии……………………………..
Комментарии C++…………………………………..
Разделители комментариев и пробелы………………….
Лексемы……………………………………………
Ключевые слова……………………………………
Идентификаторы……………………………………
Константы………………………………………..
Константы и их внутреннее представление……………..
Описание операций…………………………………..
Унарные операции ………………………………..
Бинарные операции…………………………………
Пунктуаторы ……………………………………
Объявления…………………………………………
Объекты ……………………………………….
Именующие выражения (Lvalues) ……………………
Типы и классы памяти ……………………………
Контекст ………………………………………
Видимость………………………………………..
Продолжительность…………………………………
Единицы трансляции ……………………………….
Компоновка ………………………………………
Синтаксис объявления………………………………..
Предварительные определения ……………………..
Возможные объявления ……………………………
Внешние объявления и определения …………………
Спецификаторы типа ……………………………….
Таксономия типа ………………………………..
Фундаментальные типы ……………………………
Инициализация…………………………………….
Простые объявления………………………………..
Спецификаторы класса памяти………………………..
Модификаторы……………………………………..
Сложные объявления и деклараторы……………………
Указатели………………………………………….
Указатели объектов………………………………..
Указатели функций…………………………………
Объявления указателей …………………………..
Указатели и константы …………………………..
Арифметические операции с указателями …………….
Преобразования указателей………………………….
Объявления ссылок в С++ …………………………
Массивы …………………………………………
Функции……………………………………………
Объявления и определения ………………………..
Объявления и прототипы ………………………….
Объявления ………………………………………
Объявления формальных параметров …………………
Вызовы функций и преобразования аргументов ………….
Структуры………………………………………….
Структуры без тегов и определения типов (typedef)…….
Объявления компонентов структуры …………………
Структуры и функции …………………………….
Доступ к компоненту структуры ……………………

Отличный хостинг поддерживающий Perl, PHP (C++) —

— 3 —
Выравнивание по границе слова ……………………
Пространство имен структур ………………………..
Неполные объявления …………………………….
Битовые поля …………………………………..
Объединения………………………………………..
Объявления объединений …………………………..
Перечислимые данные…………………………………
Выражения………………………………………….

Выражения и Turbo C++ …………………………..
Последовательность вычислений ……………………
Ошибки и переполнения …………………………..
Семантика операций………………………………….
Постфиксные и префиксные операции…………………..
Операции инкремента и декремента …………………
Унарные операции ……………………………….
Операция sizeof ……………………………….
Операции типа умножения …………………………
Операции типа сложения ………………………….
Операции поразрядного сдвига …………………….
Операции отношения ……………………………….
Операции типа равенства …………………………
Операция поразрядного И & ………………………..
Операция поразрядного исключающего ИЛИ ^……………
Операция поразрядного включающего ИЛИ \!……………
Операция логического И &&…………………………
Операция логического ИЛИ \!\!……………………..
Условная операция ?:………………………………
Операции присвоения …………………………….
Операция с запятой………………………………..
Операторы………………………………………….
Блоки …………………………………………
Операторы-с-метками …………………………….
Операторы-выражения …………………………….
Операторы выбора ……………………………….
Операторы итерации ……………………………….
Операторы перехода ……………………………….
С++……………………………………………….
Ссылки ………………………………………..
Операция доступа к контексту …………………….
Операции new и delete …………………………..
Классы ………………………………………..
Виртуальные базовые классы ………………………..
«Друзья» классов (friend)………………………….
Конструкторы и деструкторы ………………………..
Конструкторы …………………………………..
Деструкторы ……………………………………
Перегруженные операции ………………………….
Операции-функции ………………………………..
Виртуальные функции……………………………….
Абстрактные классы ……………………………….
Контекст С++ …………………………………..
Директивы препроцессора Turbo C++…………………….
Пустая директива # ……………………………….
Директивы #define и #undef ………………………..
Включение файлов директивой #include ……………..
Условная компиляция …………………………….
Директива управления нумерацией строк #line ……….
Директива #error ……………………………….
Директива #pragma…………………………………
Предопределенные макросы ………………………..
Глава 2. Перекрестные ссылки по библиотеке исполняющей
системы……………………………………………
Зачем нужен доступ к исходным кодам библиотеки исполняющей
системы…………………………………………..
Файлы заголовка Turbo C++……………………………
Категории библиотечных подпрограмм……………………
Глава 3 Потоки С++…………………………….

— 4 —
Новые потоки вместо старых…………………………..
Использование потоков 2.0……………………………
Что такое поток? ………………………………..
Библиотека iostream ………………………………
Четыре стандартных потока ………………………..
Вывод …………………………………………
Ввод…………………………………………….
Инициализация потоков ……………………………
Простой ввод/вывод в файл ………………………..
Состояния ошибки потока ввода/вывода………………..
Использование потоков прошлых версий………………….
Рекомендации по переходу к потокам версии 2.0………….
Глава 4 Модели памяти, операции с плавающей точкой и
оверлеи……………………………………………
Модели памяти………………………………………
Регистры 8086…………………………………….
Сегментация памяти………………………………..
Указатели………………………………………..
Шесть моделей памяти………………………………
Программирование с использованием различных моделей памяти
адресные модификаторы……………………………..
Объявление ближних или дальних функций …………….
Объявление указателей near, far или huge…………….
Использование библиотечных файлов…………………..
Компоновка смешанных модулей ……………………..
Опции типа чисел с плавающей точкой…………………..
Эмулирование платы 80х87…………………………..
Получение кода только для машин с 80х87 ……………
Получение кода без операций с плавающей точкой ……..
Опция быстрых вычислений с плавающей точкой ………..
Переменная операционной среды 87……………………
Регистры и 80х87 ………………………………..
Математические операции с комплексными числами…………
Использование двоично-десятичной (BCD) математики…….
Использование оперативной памяти Turbo C++…………….
Оверлеи (VROOMM)……………………………………
Работа программ с оверлеями………………………..
Требования……………………………………….
Использование оверлеев ……………………………
Разработка программ с перекрытиями………………….
Свопинг ………………………………………..
Дополнительная память (EMS)………………………..

Страницы: 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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

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

Предварительные определения

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

Если достигнут конец единицы трансляции, а для иденти-
фикатора так и не было встречено определения с инициализато-
ром, то предварительное определение становится полным
определением, а для определенного таким образом объекта ре-
зервируется неинициализированная (заполненнаянулями) область
памяти. Например,

int x;
int x; /* допустимо, резервируется одна копия x */

int y;
int y = 4; /* допустимо, y инициализируется значением 4 */

int z = 5;
int z = 6; /* недопустимо, т.к. оба определения
инициализированы */
Возможные объявления

В число объектов, которые могут быть объявлены, входят:

— переменные
— функции
— классы и компоненты классов (С++)
— типы
— теги структур, объединений и перечислимых данных
— компоненты структур
— компоненты объединений
— массивы прочих типов
— перечислимые константы
— метки операторов
— макросы препроцессора

Полный синтаксис объявлений показан в следующих табли-

— 35 —
цах. Рекурсивная природа синтаксиса описателей позволяет
создавать сложные описатели. Для улучшения читаемости мы
пошли на использование определяемого типа (typedef).

Синтаксис объявлений Turbo C++ Таблица 1.10
————————————————————
объявление:

объявление-asm
объявление-функции
спецификация-типа-компоновки

спецификатор-объявления:
спецификатор-класса-памяти
спецификатор-типа
спецификатор-функции
friend (только для С++)
typedef

спецификаторы-объявления:
спецификатор-объявления

спецификатор-класса-памяти:
auto
register
static
extern

спецификатор-функции: (только для С++)
inline
virtual

спецификатор-типа:
имя-простого-типа
спецификатор-класса
спецификатор-перечислимых-данных
спецификатор-усовершенствованного-типа
const
volatile

имя-простого-типа:
имя-класса
имя-typedef
char
short
int

long
signed
unsigned
float
double
void

спецификатор-усовершенствованного-типа:
ключ-класса идентификатор
ключ-класса имя-класса
enum имя-перечислимых-данных

ключ-класса: (только для С++)
class
struct
union

список-перечислимых-данных:
нумератор
список-нумераторовнумератор

— 36 —
нумератор:
идентификатор
идентификатор = выражение-типа-константы

выражение-типа-константы:
условное-выражение

спецификация-типа-компоновки: (только для С++)
extern строка (* *)
extern строка объявление

список-объявления:
объявление
список-объявления объявление
————————————————————

Для следующей таблицы отметим, что на количество и по-
рядок модификаторов и квалификаторов наложены ограничения.
Кроме того, перечисленные модификаторыявляются единственным-
дополнением синтаксиса декларатора, не входящим в стандарт
ANSI C и С++. Каждый модификатор подробно описан, начиная со
стр.46 оригинала.

Синтаксис декларатора Turbo C++ Таблица 1.11
————————————————————
список-декларатора:
инициализатор-декларатор
список-декларатораинициализатор-декларатор

инициализатор-декларатор:
имя-декларатора
список-модификаторов
операция-указателядекларатор
декларатор (список-объявления-параметров)

(список-со-квалификаторов — только для С++)
декларатор []

список-модификаторов:
модификатор
список-модификаторов модификатор

модификатор:
cdecl
pascal
interrupt
near
far
huge

операция-указателя:
*
& (только для С++)
имя-класса = * (только для C++)

список-со-квалификаторов:
со-квалификатор

со-квалификатор:
const
volatile

имя-декларатора:
имя
имя-класса (только для С++)
имя-класса (только для С++)
имя-typedef

— 37 —

имя-типа:
спецификатор-типа

абстрактный-декларатор:
операция-указателя
(список-аргументов-объявления)

[]

список-объявления-аргументов:

Страницы: 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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

Если опция выравнивания включена, топриведенный пример
структуры имел бы добавленный перед double байт, и весь объ-
ект в целом занимал бы 32 байта.

Пространство имен структур

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

Имена компонентов в пределах данной структуры или объ-
единения лбязаны быть уникальными, но среди разных структур
или объединений они могут совпадать. Например,

goto s;

struct s (* // так можно; теги и имена меток находятся
в разных // адресных пространствах
int s; // так можно; теги, имена меток и имена компо-
нентов // дятся в разных адресных пространствах
float s;// так нельзя: повторение имени компонентов
структур *) s; // так можно; пространства имен переменных
различны // В С++ это допустимо только если s не имеет
// конструктора.

union s (* // так нельзя: повторение имен в пространс-
тве тегов int s; // так можно: новое пространство компонен-
тов float f;
*) f; // так можно: пространство имен переменных

struct t (*
int s; // так можно: следующее пространство имен компо-
ненто

*) s; // так нельзя: повторение имен переменных

Неполные объявления

Указатель структуры типа А допустим в объявлении другой
структуры В до объявления структуры А:

struct A;// неполное объявление struct B (* struct A
*pa *);
struct A (* struct B *pb *);

Первое объявление А называется неполным, поскольку в
этой точке отсутствует определение А. В данной ситуации не-
полное объявление допустимо, поскольку в объявлении В размер
А необязателен. Битовые поля

— 67 —
Структура можетсодержать любые комбинации битовых полей
с данными других типов.

Целочисленные компоненты типа signed или unsigned можно
объявить битовыми полями шириной от 1 до 16 бит. Ширина би-
тового поля и его опциональный идентификатор задаются следу-
ющим образом:

спецификатор-типа :ширина;

где спецификатор-типа это char, unsigned char, int или
unsigned int. Битовые поля располагаются с нижнего и кончая
саршим битом слова. Выражение «ширина» должно быть задано и
должно давать целочисленную константу со значением в диапа-
зоне от 0 до 16.

Если идентификатор битового поля опущен, то число би-
тов, заданное выражением «ширина», распределяется в памяти,
но поле при этом остается недоступным программе. Это позво-
ляет создавать битовые шаблоны для, например, аппаратных ре-
гистров компьютера, в которых некоторые биты не используют-
ся. Пример:

struct mystruct (*
int i:2;
unsigned j:5;
int :4;
int k:1;
unsigned m:4;
*) a, b, c;

создает следующее распределение памяти.

————————————————————
\! 15\! 14\! 13\! 12\! 11\! 10\! 9 \! 8 \! 7 \! 6 \! 5
\! 4 \! 3 \! 2 \! 1 \! 0 \!
————————————————————
\! x \! x \! x \! x \! x \! x \! x \! x \! x \! x \! x

\! x \! x \! x \! x \! x \!
————————————————————
\!\!\!\!\!\!
————————————————————
\! m \! k \!не используется\! j \! i \!
————————————————————

Целочисленные поля хранятся в виде дополнения до двух,
причем крайний левый бит побещается в MSB (наиболее значащий
бит).Для битового поля типа Int (например, signed) MSB ин-
терпретируется как знаковый бит. Битовое поле шириной 2, со-
держащее двоичное 11, будет, следовательно, в случае типа
unsigned интерпретироватьсякак 3, а в случае Int как -1. В
предыдущем примере допустимое выражение a.i = 6 поместит в
a.i двоичное 10 = -2, не выдавая каких-либо предупреждений.
Поле k типа signed int шириной 1 может содержать только зна-
чения -1 и 0, так как битовый шаблон 1 будет интерпретирован
как -1.

Примечание

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

— 68 —

Выражение &mystruct.x недопустимо, так как x это иден-
тификатор битового поля, а никакой гарантии, что mystruct.x
имеет адрес на границе байта, нет.

Объединения

Объединения соответствуют типам вариантных записей язы-
ков Pascal и Modula-2.

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

union myunion (* /* тег объединения = myunion */
int i;
double d;
char ch;
*) mu, *muptr=μ

идентификатор mu типа union myunion может служить для
хранения 2-байтового значения int, 8-байтового значения
double или 1-байтового char, но одновременно — только одного
из этих значений.

Обе операции sizeof(union myunion) и sizeof (mu) возв-
ращают значение 8, но когда mu содержит объект типа int, то
6 байт остаются неиспользованными (туда помещаются симво-
лы-заполнители), а когда mu сщдержит объект типа char — то 7
байт. Доступ к компонентам объединения выполняетсяпри помощи
селекторов компонента структуры (. и ->), но требуется соб-
людать осторожность:

mu.d = 4.016;
printf(«mu.d = %f\n»,mu.d);// порядок: на дисплее mu.d
= 4.016
printf(«mu.i = %f\n»,mu.i);// забавный результат !
mu.ср = ‘A’;
printf(«mu.ch = %c\n»,mu.ch); // порядок: на дисплее
mu.ch = A
printf(«mu.d = %f\n»,mu.d); // забавный результат !
muptr->i = 3; printf(«mu.i = %d\n»,mu.i); // порядок: на
дисплее mu.i = 3

Второй оператор printf допустим, поскольку mu.i цело-
численного типа. Однако, битовая комбинация в mu.i соответс-
твует части ранее присвоенного значения типа double и не
даст как правило полезной целочисленной интерпретации.

При правильных преобразованиях указатель объединения
может указывать на любые его компоненты, и наоборот.

Объявления объединений

Общий синтаксисобъявления объединений во многом напоми-
нает синтаксис объявления структур. Различия состоят в сле-
дующем:

1. Объединения могут содержать битовые поля, но актив-
ным бывает только одно изних. Все они начинаются в начале
объединения.

— 69 —
2. С++ : В отличие от структур С++, объединения С++ не
могут использовать спецификаторы класса доступа:public,
private и protected. Все поля объединения имеют доступ

Страницы: 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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

Расширенная память (Ext)…………………………..
Глава 5 Видео функции…………………..
Несколько слов о видео режимах……………………….
Несколько слов о текстовых и графических окнах…………
Что такое окно ? ……………………………….
Что такое графическое окно ? ……………………..
Координаты……………………………………….
Программирование в текстовом режиме…………………..
Функции консольного ввода/вывода …………………..
Текстовые окна……………………………………
Тип text_mode…………………………………….
Цвета текста ……………………………………
Высокоскоростной вывод: переменная directvideo ………
Программирование в графическом режиме…………………
Функции библиотеки graphics………………………..
Управление цветом на CGA…………………………..
Глава 6…………………………………………….
Смешанное программирование…………………………..
Последовательности передачи параметров ……………
Подготовка к вызову .ASM из Turbo C++…………………
Упрощенные сегментные директивы …………………..
Стандартные сегментные директивы …………………
Определение данных — констант и переменных ………….
Определение глобальных и внешних идентификаторов …..
Подготовка к вызову Turbo C++ из .ASM…………………

— 5 —
Ссылки к функциям…………………………………
Ссылки к данным ………………………………..
Определение подпрограмм на языке ассемблера……………
Передача параметров……………………………….
Обработка значений возврата ……………………….
Соглашения о регистрах………………………………
Вызов функций С из модулей .ASM………………………
Псевдопеременные, встраиваемые ассемблерные коды и функции
прерывания………………………………………..
Псевдопеременные ……………………………….
Встраиваемые ассемблерные коды …………………..
Функции прерывания………………………………..
Практические примеры программ низкого уровня ………
Глава 7 Сообщения об ошибках………………….
Сообщения об ошибках времени выполнения……………….
Сообщения об ошибках компилятора……………………..
Фатальные ошибки……………………………………
Ошибки…………………………………………….
Предупреждения……………………………………..
Приложение АСтандарты ANSI, зависящие от
реализации…………………………………………
.
— 6 —

Введение

Документ «Начало работы» содержит обзор всего комплекта
документации к Turbo C++. Информация о том, как с наибольшей
эффективностью использовать Руководства по Turbo C++, содер-
жится во введении и главе 2 этого документа.

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

Прочесть документ «Начало работы» следует, если:

1. Вы ранее никогда не программировали ни на одном язы-
ке.
2. Вы ранее программировали, но не на C, и желаете про-
честь введение в язык C.
3. Вам нужна информация о том, как установить на компь-
ютере Turbo C++.

В Руководстве пользователя находится информация об
интегрированной среде Turbo (включая редактор), администра-
торе управляющей системы, компиляторе командной строки, до-
полняющих Turbo C++ утилитах и макроязыке редактора Turbo.

Справочник по библиотеке содержит в алфавитном порядке
листинг функций и глобальных переменных Turbo C++.

Содержание данного руководства

Глава 1:»Стандарт языка Turbo C++» описывает язык Turbo
C++. Здесь приводятся все отличия от стандарта ANSI C. Дан-
ная глава также включает справочник по языкам C и C++.

Глава 2: «Перекрестные ссылки по библиотеке управляющей
системы» содержит информацию об исходных кодах библиотеки
исполняющей системы. Здесь также описаны файлы заголовков и
приводятся перекрестные ссылки по библиотеке управляющей
системы, организованные по субъектам библиотеки. Например,

если вы хотите выяснить, какие функции относятся к графике,
вы должны обратиться к разделу данной главы «Графика».

Глава 3:»Потоки C++» рассказывает, как использовать
библиотеку потоков C++.

Глава 4:»Модели памяти, операции с плавающей точкой и
оверлеи» рассматривает модели памяти, программирование со
смешанными моделями памяти, вычисления с плавающей точкой и
оверлеями.

Глава 5:»Видео-функции» посвящена обработке в Turbo C++
текстов и графических изображений.

Глава 6:»Интерфейс с языком ассемблера» говорит о том,
как нужно писать программы на языке ассемблера, чтобы они
правильно работали при вызове из программ на Turbo C++.

Глава 7: «Сообщения об ошибках» перечисляет и объясняет
все фатальные ошибки, ошибки и предупреждения исполняющей

— 7 —
системы и компилятора, а также дает возможные рекомендации
по их устранению.

Приложение А: «Стандарты ANSI, зависимые от реализа-
ции» описывает те аспекты стандарта ANSI C, которые были оп-
ределены с некоторой степенью свободы или не были определены
вообще в стандарте ANSI. Следовательно, эти аспекты могут
варьироваться в зависимости от конкретной реализации. Данное
приложение сообщает о том, как Turbo C++ поступает в отноше-
нии каждого из этих аспектов.

Глава 1 Стандарт языка Turbo C++

В данной главе дается подробное справочноеруководство
программиста по языку Turbo C++. Оно не является руководс-
твом по изучению языка, а скорее формальным описанием языков
C и C++ в их реализации программным продуктом Turbo C++. В
данной главе описываются грамматические правила записи
структуры фраз и лексики языка, а также дается подробное из-
ложение имеющихся директив препроцессора. При формулировке
синтаксиса используется модифицированная запись Бэкуса-Науэ-
ра,при необходимости сопровождаемая кратким описанием и при-
мерами программ.

Turbo C++ реализует стандарт ANSI C, разработанный тех-
ническим комитетом X3J11 между июнем 1983 и декабрем 1988
гг., с некоторыми расширениями, оговариваемыми вданномтекс-
те. Вы имеете возможность устанавливать опции компилятора,
которые будут предупреждать вас о том, чтотакие расширения
встретилисьпри работе компилятора. Вы можете также настроить
компилятор таким образом, чтобы он рассматривал ключевые
слова расширений Turbo C++ в качестве нормальных идентифика-
торов (см. Главу 4,»Компилятор командной строки», в Руко-
водстве пользователя).

Существуют также «согласующие» расширения, включаемые
посредством директив #pragma, предлагаемых стандартом ANSI
C, предназначенные для работы с нестандартными, зависимыми
от конкретной реализации средствами языка.

Turbo C++ является также полной реализацией AT&TC++
версии 2.00, объектно-ориентированного надмножества C, раз-
работанного Бьерном Строструпом из AT&T Bell Laboratories.
Помимо того,что C++ дополняет C многими новыми средствами и
возможностями, он также и отличен от него в большей или
меньшей степени. В настоящей главе содержатся замечания по
этим отличиям. Все средства языка Turbo C++,имеющие отклоне-
ния от C++, более подробно рассматриваются, начиная со стра-
ницы 98.

Синтаксис и терминология

Синтаксические определения состоят из имени определяе-
мого в настоящий момент и не определенного где-либо выше
термина, за которым следует двоеточие (:). Альтернативы
обычно следуют за этим в отдельных строках, но могут также
помещаться и в одной строке; в таком случае им предшествует
фраза «одно из». Например,

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

— 8 —

восьмеричная цифра: одно из
0 1 2 3 4 5 6 7

Опциональные элементы конструкции заключаются в угловые
скобки:

целочисленный-суффикс:
суффикс-целого-без-знака

В данной главеслово «аргумент» везде используется для
обозначения действительного значения, передаваемогопри вызо-

Страницы: 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