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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

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

Данный раздел начинает часть главы, посвященную расс-
мотрению грамматики структуры фраз языка; описание различий
между грамматическими правилами лексики и структуры фраз
языка см. на стр.4.

Объявление

type декларатор []

объявляет масив, состоящий из элементов типа type. Мас-
сив в С состоит из непрерывной области памяти, по размеру
позволяющей в точности разместить все его элементы.

Если в деклараторе массива задано выражение, то при
еговычислении должна получаться положительная целочисленная
константа. Получившееся значение представляет собой число
элементов массива. Каждый из элементовмассива нумеруется от
0 до числа элементов массива, минус единица.

Многомерные массивы создаются путем объявления массивов
из элементов типа массив. Таким образом, двумерный массив из
пяти строк и семи столбцов с именем alpha объявляется следу-
ющим образом:

type alpha [5] [7];

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

— 58 —
Такой массив имеет неопределенный размер. Контекстом, где
допустимо такое положение, является тот случай, когдадля ре-
зервирования памяти размер массива не требуется. Например,
для объявление объекта типа массива extern точный размер
массива не требуется; не требуется он и при передаче функции
параметра типа массива. Будучи специальным расширением ANSI
C, Turbo C также позволяет объявлятьв качестве последнего
элемента структуры массив неопределенного размера. Такой
массив не увеличивает размера структуры, а для того, чтобы
обеспечить правильное выравнивание структуры, ее можно спе-
циально дополнить символами-заполнителями. Такие структуры
обычно используются при динамическом распределении памяти,
когда для правильного резервирования области памяти к разме-
ру структуры следует явно прибавить фактический размер необ-
ходимого массива.

За исключением использования массива в качестве операн-
да операции sizeof или &, выражение с типом массива
преобразуется в константу-указатель на первый элемент масси-
ва.

Функции

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

Объявления и определения

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

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

В С++ вы должны всегда пользоваться прототипами функ-
ции. Мы рекомендуем также всегда использовать их и в С.

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

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

Объявления и прототипы

В оригинальном стиле объявлений Кернигэна и Ритчи функ-
ция могла быть либо объявлена неявно, по ее вызову, либо яв-
но:

func()

где type — это опциональный тип возврата, по умолчанию

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

Эта задача упрощается благодаря введению прототипа
функции со следующим синтаксисом объявления:

func(список-деклараторов-параметров)

При помощи IDE или опции компилятора командной строки
можно разрешить выдачу следующего предупреждения: «Function
called without a prototype» («Функция вызывается без прото-
типа»).

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

long lmax(long v1, long v2); /* прототип */
main()
(*
int limit = 32;
char ch = ‘A’;
long mval;
mval = lmax(limit,ch): /* вызов функции */

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

Прототипы функций также упрощают документирование кодов
программы. Например, функция strcpy принимает два параметра:
исходную строку и строку назначения. Вопрос, где какая из
них? Прототип функции

char *strcpy(char *dest, char *source);

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

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

func(void);

В С++ func() также означает функцию, не принимающую ар-
гументов.

stdarg.h содержит макросы, которые можно использовать в
функциях, определяемых пользователем, с переменным числом

— 60 —
параметров.

Прототип функции обычно объявляет функцию, принимающую
фиксированное число параметров. Для функции С, принимающей
переменное число параметров (например, printf) прототип
функции может заканчиваться многоточием (…), например:

f(int *const, long total, …)

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

Ниже приводятся примеры деклараторов функций и прототипы:

int f(); /* В С это функция, возвращащая int, без ин-
формации о параметрах. Это «классический стиль» Кернигэна и
Ритчи */

int f(); /* В С++ это функция, не принимающая аргументов */

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

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

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

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