Введение
Документ "Начало работы" содержит обзор всего комплекта документации к 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: "Сообщения об ошибках" перечисляет и объясняет все фатальные ошибки, ошибки и предупреждения исполняющей системы и компилятора, а также дает возможные рекомендации по их устранению.
Приложение А: "Стандарты 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.
Синтаксис и терминология
Синтаксические определения состоят из имени определяемого в настоящий момент и не определенного где-либо выше термина, за которым следует двоеточие (:). Альтернативы обычно следуют за этим в отдельных строках, но могут также помещаться и в одной строке; в таком случае им предшествует фраза "одно из". Например,
внешнее-определение:
определение-функции
объявление
восьмеричная цифра: одно из
0 1 2 3 4 5 6 7
Опциональные элементы конструкции заключаются в угловые скобки:
целочисленный-суффикс:
суффикс-целого-без-знака
В данной главеслово "аргумент" везде используется для обозначения действительного значения, передаваемогопри вызове функции. "Параметр" обозначает переменную, определяемую в заголовке функции, которая будет содержать в себе передаваемое значение.
Грамматические правила структуры фраз и лексики языка
Грамматические правила лексикиязыка 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;
и
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++
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;
позволяет избежать этой проблемы.
Лексемы
Turbo C++ распознает лексемы шести классов: ключевые слова, идентификаторы, константы, строковые литералы, операции и знаки пунктуации (также называемые разделителями). Формальное описание лексемы имеет следующий вид:
лексема:
ключевое слово
идентификатор
константа
строковый литерал
операция
знак пунктуации
Во время лексического анализа исходного кода лексемы выделяются методом, при котором из строки символов обязательно выбирается лексема максимальной длины. Например, слово external будетрассматриваться как отдельный идентификатор, а некак ключевое слово extern, за которым следует идентификатор al.
Ключевые слова
Ключевыми словами называются слова, зарезервированныедля специальных целей, которые не должны использоваться в качестве обычных имен идентификаторов. В следующих двух таблицах приводятся ключевые слова Turbo C++. Вы можете использовать опции компилятора командной строки (или опции в IDE), чтобы выбрать только ключевые словаANSI, ключевые слова UNIX и т.д. Информацию об этих опциях см. в главах 1, "Справочник IDE", и 4, "Компилятор командной строки" в Руководстве пользователя.
Все ключевые слова Turbo C++ Таблица 1.1
asm _ds interrupt short
auto else _loadds signed
break enum long sizeof
case _es near _ss
catch _export new static
cdecl extern operator struct
char far pascal switch
class float private template
const for protected this
continue friend public typedef
_cs goto register union
default huge _regparam unsigned
delete if return virtual
do inline _saverages void
double int _seg volatile
while
Расширения Turbo C++ относительно ANSI C Таблица 1.2
cdecl _export _loadds _saveregs
_cs far near _seg
_ds huge pascal _ss
_es interrupt _regparam
Ключевые слова, специфичные для C++ Таблица 1.3
catch friend operator public
class inline private template
delete new protected this
virtual
Регистровые псевдопеременные Turbo C++ Таблица 1.4
_AH _BL _AL _BP _AX _BX _BH _CH _SP _CL _DL _CX _DX _DH _FLAGS _DI _SI
Идентификаторы
Формальное определение идентификатора имеет следующий вид:
идентификатор:
не-цифра
идентификатор не-цифра
идентификатор цифра
не-цифра: одно из
a b c d e f g h i j k l m n o p q r s t u v w x y z _
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
цифра: одно из
0 1 2 3 4 5 6 7 8 9
Ограничения состава и длины идентификаторов
Идентификаторы представляют собой произвольные имена любой длины, присваиваемыеклассам, объектам, функциям,переменным, определяемым пользователем типам данных ит.д. Идентификаторы могут содержать буквы от A до Z и от a до z, символ подчеркивания (_) и цифры от 0 до 9. Существует только два ограничения:
1. Первый символ должен являться буквой или символом подчеркивания.
Отметим, что идентификаторы в Turbo C++ значимы до любой длины.
2. По умолчанию Turbo C++ распознает только первые 32 символа в качестве значимых. Число значимых символов может быть уменьшено при помощи меню или опций командной строки, но не может быть увеличено. Используйте опцию -In TCC, либо опцию меню O!C!S!Identifier Length, где 1
последовательность-цифр экспоненциальная часть
дробная константа:
.
.
экспоненциальная-часть:
e последовательность-цифр
E последовательность-цифр
знак: одно из
+ -
последовательность-цифр:
цифра
последовательность-цифр цифра
суффикс-константы-с-плавающей-точкой: одно из
f l F L
целочисленная-константа:
десятичная-константа
восьмеричная-константа
шестнадцатиричная-константа
ной-константы>
десятичная-константа:
цифра-кроме-нуля
десятичная-константа цифра
восьмеричная-константа:
0
восьмеричная-константа восьмеричная-цифра
шестнадцатиричная-константа:
0 x шестнадцатиричная-цифра
0 X шестнадцатиричная-цифра
шестнадцатиричная-константа шестнадцатиричная-цифра
цифра-кроме-нуля: одно из
1 2 3 4 5 6 7 8 9
восьмеричная-цифра: одно из
0 1 2 3 4 5 6 7
шестнадцатиричная-цифра: одно из
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
суффикс-целочисленной-константы:
суффикс-константы-без-знака
суффикс-длинной-константы
суффикс-константы-без-знака: одно из
u U
суффикс-длинной-константы: одно из
l L
перечислимая-константа:
идентификатор
символьная-константа:
последовательность-символов-c
последовательность-символов-c:
символ-c
последовательность-символов-c символ-c
символ-c:
любой символ из исходного набора символов, за исключением символов одинарной кавычки ('), обратной наклонной черты () или управляющей-последовательности символа новой строки.
управляющая-последовательность: одно из
* ' ?
a bf n
o ooooo r
t vXh... xh...
Целочисленные константы
Целочисленные константы могут быть десятичными (основание системы счисления 10), восьмеричными (основание 8)или шестнадцатиричными (основание 16). При отсутствии переопределяющих суффиксов типданныхцелочисленной константы выводится из ее значения, как показано в таблице 1.6. Отметим, что правила для десятичных и не-десятичных констант различны.
Десятичные константы
Допустимыми являются десятичные константы величиной от 0 до 4,294,967,295. Константы, выходящие за указанные пределы, вызывают ошибку. Десятичныеконстанты не могут иметь ведущие нули. Целочисленнаяконстанта с ведущим нулем рассматриваетсякак восьмеричная. Таким образом,
int i = 10; /* десятичное 10 */
int i = 010; /* десятичное 8 */
int i = 0; /* десятичное 0 = восьмеричному 0! */
Отрицательные константы- это просто константы без знака, к которым применена унарная операция минус.
Восьмеричные константы
Все константыс ведущим нулем рассматриваются как восьмеричные.Если восьмеричная константа содержит недопустимые цифры 8 или 9, выдается сообщение об ошибке. Ошибка будет также выдаваться при превышении восьмеричной константой значения 037777777777.
Шестнадцатиричные константы
Все константы, начинающиеся с 0x (или 0X) рассматриваются как шестнадцатиричные. Шестнадцатиричные константы,превышающие 0xFFFFFFFF, приводят к ошибке.
Суффиксы длинных констант и констант без знака
Если законстантой следует суффикс L (или l), то такая константа будет представлена как длинная (типа long).Аналогичным образом, суффикс U (или u) делает константу константой без знака (unsigned). Если численное значение константы превышает десятичное 65,535, независимо от используемого основаниясистемы счисления, то такая константа будет иметь тип unsigned long. Суффиксы можно указывать для одной и той же константы в произвольном порядке и набирать в любом регистре: ul, lu, UL и т.д.
Тип данных константы при отсутствии каких-либо суффиксов вообще (U, u, L или l) берется из следующей таблицы,первыйже, который удовлетворяет требованиям величины этой константы:
-----------------------------------------------------------
десятичная int, long int, unsigned long int
восьмеричная int, unsigned int, long int, unsigned long int
шестнадцатиричная int, unsigned int, long int, unsigned long int
-----------------------------------------------------------
Если константа имеет суффикс U или u, то ее тип данных будет первым из типов unsigned int, insigned long int, который удовлетворит требованиям ее величины.
Если константа имеет суффикс L или l, то ее тип данных будет первым из типов long int, unsigned long int, который удовлетворит требованиям ее величины.
Если константа имеет оба суффикса u и l (ul, lu, Ul, lU,uL, Lu, LU или UL), то она будет иметь тип данных unsigned long int.
В таблице 1.6 сведены представления целочисленных констант для всех трех систем счисления. Указанные типы данных предполагают отсутствие переопределяющих суффиксов L или U.
Целочисленные константы Turbo C++ без L или U Таблица 1.6
Десятичные константы
0 до 32,767 int
32,768 до 2,147,483,647 long
2,147,483,648 до 4,294,967,295 unsigned long
> 4294967295 Генерируется ошибка
Восьмеричные константы
00 до 077777 int
0100000 до 0177777 unsigned int
02000000 до 017777777777 long
020000000000 до 037777777777 unsigned long
> 037777777777 Генерируется ошибка
Шестнадцатиричные константы
0x0000 до 0x7FFF int
0x8000 до 0xFFFF unsigned int
0x10000 до 0x7FFFFFFF long
0x80000000 до 0xFFFFFFFF unsigned long
> 0xFFFFFFFF Генерируется ошибка
Символьные константы
Символьная константа - этоодин или более символов, заключенных в одинарные кавычки, например 'F', '=', 'n'. В C константы изодногосимвола имеюттип Int и имеют внутреннее представление16 бит, в то времякак старший байт слова заполняется нулем или знаком. В C++ константа из одного символа имеет тип char. Многосимвольные константы как в C, так и в C ++, имеют тип данных Int.
Управляющие последовательности
Для введения управляющих последовательностей,позволяющих получить визуальное представление некоторых не имеющих графическогоаналога символов, используется символ обратной наклонной черты (). Например, в качестве одного символа новой строки можно записать константу n.
Обратнаянаклонная черта используетсяс восьмеричными или шестнадцатиричными числами для представления ASCII-символами управляющего кода, соответствующемуэтому значению; например, '