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

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

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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

список-объявления-арг, …
…(только для С++)

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

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

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

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

инициализатор:
= выражение
= (список-инициализаторов)
(список-выражений) (только для С++)

список-инициализаторов:
выражение
список-инициализаторов , выражение
(список-инициализаторов)
————————————————————
Внешние объявления и определения

Спецификаторы класса памяти auto и registerво внешнем
объявлении появиться не могут (см. «Единицы трансляции»).
Для каждого идентификатора в единице трансляции, объявленной
с внешним типомкомпоновки, может существовать не более одно-
го внешнего определения.

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

Turbo C++ позволяет затем переобъявление внешних имен,
таких как массивы, структуры и объединения, добавляя инфор-
мацию к ранее выполненным объявлениям. Например,

int a[] // нет размера
struct mystruct; // только тег, без объявления компонентов

— 38 —
int a[3] = [1, 2, 3]; // задание размера и инициализация
struct mystruct (*
int i, j;
*); // добавление деклараторов компонентов

Объявления классов Turbo C++ (только С++) Таблица 1.12
————————————————————
спецификатор-класса:
заголовок-класса ()

заголовок-класса:
ключ-класса
ключ-класса имя-класса

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

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

список-декларатора-компонентов:
декларатор-компонента
список-декларатора-компонентов, декларатор-компонента

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

pure-спецификатор:
=0

базовый-спецификатор:
:базовый-список

базовый-список:
базовый-спецификатор

базовый-список, базовый-спецификатор

базовый-спецификатор:
имя-класса
virtual имя-класса
спецификатор-доступа Юvirtual> имя-класса

спецификатор-доступа:
private
protected
public

имя-функции-преобразования:
operator имя-типа-преобразования

имя-типа-преобразования:
спецификация-типа

инициализатор-конструктора:
: список-инициализаторов-памяти

список-инициализаторов-памяти:
инициализатор-памяти
инициализатор-памяти, список-инициализаторов-памяти

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

— 39 —

имя-функции-операции:
operator операция

операция: одно из
new delete sizeof

+ — * /% ^
& \! !=
+= -= *= /=%= ^=
&= \!= >>>= ()
[] .*
————————————————————

Спецификаторы типа

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

int i; // объявление i как целого со знаком
unsigned char ch1, ch2; // объявление двух символьных
без знака

По устоявшейся традиции, если спецификатор типа опущен,
то по умолчанию назначается тип signed int (или, что эквива-
лентно, int). Однако, в С++ встречаются ситуации, когда от-
сутствие спецификатора типа ведет к синтаксической неодноз-
начности, поэтому в практике работы с С++ используется явный
ввод всех спецификаторов типа int.

Таксономия типа

Существует четыре базовые категории типа: void, scalar,
function и aggregate. Типы scalar и aggregate могут далее
подразделяться следующим образом:

— Scalar: арифметический, перечислимый, указатель и в С
++ ссылки

— Aggregate: массив, структура, объединение и в С++ класс

Типы делятся на фундаментальные и производные. К фунда-
ментальным относятся: void, char, int, float и double сов-
местно с short, long, signed, а также некоторые варианты с
ними unsigned. Производные типы включают в себя указатели и
ссылки на другие типы,массивы других типов, типы функций,
типы классов, структуры и объединения.

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

Задав не-пустойтип type (с некоторыми предосторожностя-
ми), можно объявлять производные типы следующим образом:

— 40 —

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

private.

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

union local87 (*
int i;
double d;
*) a = (* 20*);

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

5. С++ : Анонимные объединения не могут иметь компонен-
ты-функции.
Перечислимые данные

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

enum days (* sun, mon, tues, wed, thur, fri, sat *)
anyday;

устанавливает уникальный интегральный тип, enum days,
переменную anyday этого типа и набор нумераторов
(sun,mon,…), которым соответствуют целочисленные констан-
ты.

Turbo C++ может хранить нумераторы в одном байте, если
это позволяет диапазон значений нумераторов, когда выключена
опция -b (по умолчанию она включена; это означает, что дан-
ные типа enum всегда int), но при использовании их в выраже-
ниях выполняется этих данных преобразования к типу int.
Идентификаторы, используемые в списке нумераторов, неявно
получают тип unsigned char или int, в зависимости от значе-
ний нумераторов. Если все значения могут быть представлены
типом unsigned char, то это и будет типом каждого нумерато-
ра.

C++ В С переменной перечислимого типа может быть прис-
воено любое значение типа int — кроме этого, никакого конт-
роля типа не выполняется. В С++ переменной перечислимого
типа может присваиваться только значение одного из ее нуме-
раторов. Таким образом,

anyday = mon; // так можно
anyday = 1; // так нельзя, даже хотя mon == 1

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

enum days payday, holiday; // объявление двух переменных

С++ В С++ ключевое слово enum можно опустить, если в
пределах данного контекста имя days не дублируется.

Как и в случае объявлений struct и union, если далее
переменные данного типа enum не требуются, тег может быть
опущен:

— 70 —
enum (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* анонимный тип enum */

Подробное описание констант перечислимого типа см. на
стр. 17 оригинала.

Нумераторы, перечисленные внутри фигурных скобок, назы-
ваются перечислимыми константами. Каждой из них назначается
фиксированное целочисленное значение. При отсутствии явно
заданных инициализаторов первый нумератор (sun) устанавлива-
ется в ноль, а каждый последующий нумератор имеет значение
на единицу больше, чем предыдущий (mon = 1, tue = 2 и т.д.).

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

/* выражение инициализатора может включать в себя нуме-
раторы, объявленные ранее */
enum coins (* penny = 1, tuppence, nickel = penny + 4,
dime =10, quarter = nickel * nickel *) smallchange;

tuppence примет значение 2, nickel — значение 5, а
quarter — значение 25.

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

не запрещено.

Тип enum может участвовать во всех конструкциях,допус-
кающих использование типов int.

enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
enum days payday;
typedef enum days DAYS;
DAYS *daysptr;
int i = tues;
anyday = mon; // так можно
*daysptr = anyday; // так можно
mon = tues; // неверно: mon — это константа

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

int mon = 11;
(*
enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* нумератор mon скрывает внешнее объявление int mon */
struct days (* int i, j;); // неверно: дублируется тег days
double sat; // неверно: переопределение sat
*)
mon = 12; // снова в контексте int mon

C++ В С++ нумераторы, объявленные в пределах клас-
са,имеют контекст этого класса.

Выражения

В таблице 1.19 показано, каким образом комбинируются
идентификаторы и операции для составления грамматически вер-
ных «фраз».

— 71 —
Выражением называется последовательность операций, опе-
рандов и пунктуаторов, задающих определенное вычисление.
Формальный синтаксис, показанный в таблице 1.19, обозначает,
что выражения определяются рекурсивно: под-выражения могут
быть вложены без формальных ограничений. (Однако, если ком-
пилятор не сможет обработать какое-либо слишком сложное вы-
ражение, то будет выдано сообщение об ошибке).

Выражения Turbo C++ Таблица 1.19
————————————————————
первичное-выражение:
литерал
псевдо-переменная
(выражение)
this (только С++)
:: идентификатор (только С++)
:: имя-функции-операции (только С++)
имя

литерал:
целочисленная-константа
символьная-константа
константа-с-плавающей-точкой
строка

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

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

постфиксное-выражение:
первичное-выражение
постфиксное-выражение[выражение]
постфиксное-выражение ()
постфиксное-выражение () (только С++)
постфиксное-выражение . имя постфиксное-выражение -> имя
постфиксное-выражение ++ постфиксное-выражение —

список-выражений:
выражение-присваивания
список-выражений , выражение-присваивания

унарное-выражение:
постфиксное-выражение
++ унарное-выражение
— унарное-выражение
унарная-операция выражение-приведения
sizeof унарное-выражение
sizeof (имя-типа)
выражение-распределения (только С++)
выражение-отмены-распределения (только С++)

унарная-операция: одно из
& * + — тильда !

выражение-распределения: (только С++)
new имя-ограниченного-типа

Страницы: 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++ описаны
на стр. 5 — 58 оригинала; грамматические правила структуры
фраз Turbo C++ описаны на стр. 58 — 98 оригинала.

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

Лексемы Turbo C++ образуются из последовательности опе-
раций, выполняемых с вашейпрограммой компилятором и препро-
цессором языка.

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

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

Пробельные символы

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

int i; float f;

и

— 9 —
int i ;
float f;

лексически идентичны, а их лексический анализ в обоих
случаях дает шесть лексем:

int i ; float f ;

ASCII-символы, обычно рассматриваемые как пробельные,
могут входить в строки литералов, и в данном случаебудут за-
щищены от нормального процессаразбиения на лексемыи пробелы;
другими словами, они станут представлять собой часть строки:

char name[] = «Borland International»;

разбивается на семь лексем, включая и лексему строки
литералов «Borland International».

«Склеивание» строк символом \

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

«Borland \
International»

будет рассматриваться как «Borland International» (до-
полнительную информацию см. на стр. 17 оригинала, «Строковые
литералы»

Комментарии

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

Существует два способа указания на комментарии: тради-
ционный метод C и метод C++. Они оба поддерживаются Turbo C+
+, и кроме того, имеется дополнительное, опциональное расши-
рение, позволяющее организовывать вложенные комментарии.
Разрешается смешанное и комбинированное использование ком-
ментариев любого типа в программах C и C++.
Комментарии C

Традиционный комментарий C представляет собой любую
последовательность символов, помещаемую послепары симво-
лов/*. Признаком конца комментарияслужитперваяпара символов*
/, встретившаяся после исходной пары /*. После выполнения
макрорасширения вся эта последовательность целиком, включая
четыре разделительных символа комментария,заменяется на один
пробел. Отметим, чтонекоторые реализации C удаляют коммента-
рии, не заменяя их на пробелы.

Turbo C++ не поддерживает не-мобильной стратегии встав-
ки лексем с помощью /**/. Вставка лексем в Turbo C++ выпол-
няетсяпри помощи заданной ANSI пары символов ##, следующим
образом:

#define VAR(i,j) (i/**/j) /* не будет работать */
#define VAR(i,j) (i##j) /* в Turbo C++ будет работать */
#define VAR(i,j) (i ## j) /* также будет работать */

В Turbo C++

— 10 —

int /* объявление */ i /* как счетчика */;

после лексического анализа даст

int i ;

то есть три лексемы: Int I ;

Вложенные комментарии

ANSI C не разрешаетвложенность комментариев. Попытка
комментировать приведенную выше строку в виде

/*int /* объявление */ i /как счетчика */; */

окончится неудачей, поскольку область действия первой
пары /* будет ограничена первой парой */. Это даст в резуль-
тате лексического анализа

i ; */

что приведет к генерированию состояния синтаксической
ошибки.

По умолчанию Turbo C++ не позволяет вложенность коммен-
тариев, однако это умолчание может быть переопределено опци-
ей компилятора. Разрешить вложенность комментариев можно ли-
бо при помощи опции -C (компилятора командной строки), либо
через меню интегрированной среды программирования
O\!C\!Source Options.

Комментарии C++

Для создания вкоде C комментариеввы можете также ис-
пользовать символы //. Это средство специфично для Turbo
C++.

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

class X (* // это комментарий
… *);

Разделители комментариев и пробелы

В редких случаях пробелы перед /* и // или после */,
хотя и не являются синтаксически обязательными, нопозволяют
избежать проблем, связанных с мобильностью. Например, код C++

int i = j//* деление на k*/k;
+m;

при лексическом анализе дастint i = j +m; а не

int i = j/k;
+m;

как это можно было бы ожидать по традиционным соглаше-
ниям C. Более удобочитаемая форма

int i = j/ /* деление на k*/ k;
+m;

— 11 —
позволяет избежать этой проблемы.

Лексемы

Turbo C++ распознает лексемы шести классов: ключевые

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

Объявление типов Таблица 1.13
————————————————————
type t; Объект типа type

type array[10]; Десять типов: array[0]-array[9]

type *ptr; ptr это указатель типа

type &ref=t; ref = ссылка на тип (C++)

type func(void); func возвращает значение типа type

void func1(type t); func1 принимает параметр типа type

struct st (type t1; type t2); структура st содержит два типа
————————————————————

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

class cl (* // класс cl содержит указатель ptr на тип, плюс
// функцию, принимающую параметр type (C++)
type *ptr;
public:
void func(type*);

Тип void

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

— Пустой список параметров в объявлении функции:

int func(void); // функция не принимает аргументов

С++ обрабатывает 0 специальным образом. См. раздел
«Объявления и прототипы» на стр.60 и примеры кода на стр.61
оригинала.

— Когда объявленная функция не возвращает значений:

void func(int n); // возвращаемое значение отсутствует

— В качестве родового указателя. Указатель на void яв-
ляется родовым указателем на все что угодно:

void *ptr; // далее ptr может быть установлен на любой
// объект

— Выражения с проверкой типа:

extern int errfunc(); // возвращает код ошибки

(void) errfunc(); // значение возврата теряется
Фундаментальные типы

signed и unsigned — это модификаторы, применяемые к ин-
тегральным типам.

Фундаментальные спецификаторы типа создаются из следую-

— 41 —
щих ключевых слов:

char int signed
double long unsigned
float short

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

Интегральные типы

Типы char, short, int и long, а также их варианты
unsigned называются интегральными типами. Ниже приводятся
спецификаторы интегральных типов с помещенными в той же
строке синонимами.

Интегральные типы Таблица 1.14
————————————————————
char,signed char Если по умолчанию char установлен как
signed, то это синонимы
unsigned char
char,unsigned char Если по умолчанию char установлен как
unsigned, то это синонимы
signed char
int,signed int
unsigned,unsigned int
short,short int,signed short int
unsigned short,unsigned short int
long,long int,signed long int

unsigned long,unsigned long int
————————————————————

С типами char,short, int или long можно использовать
либо signed, либо unsigned. Если же использовать только сами
ключевые слова signed или unsigned, то они означают signed
int или unsigned int, соответственно.

В отсутствие слова unsigned обычно принимается тип
signed. Исключение возникаетв случае char. Turbo C++ позво-
ляет устанавливатьдля char умолчание signed или unsigned.
(Если вы не устанавливали это умолчание сами, то это умолча-
ние будет равно signed). Если умолчание установлено в значе-
ние unsigned, то объявление char ch объявит ch как unsigned.
Для переопределение этогоумолчания нужно задать signed char
ch. Аналогичным образом, если для char установлено умолчание
signed, то для объявления ch как unsigned char следует явно
указать unsigned char ch.

С int можно использовать либо long, либо short. Если
ключевые словаlong или short использованы сами по себе, то
они означают long int или short int, соответственно.

ANSI C не устанавливаетразмеры внутреннего представле-
ния этих типов, за исключением того, что размеры данных
short, int и long образуют неубывающую последователь-
ность»short

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