Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по С Живицкая (Мет пособие).doc
Скачиваний:
112
Добавлен:
15.06.2014
Размер:
2.11 Mб
Скачать

2.7.6.Директива #elif.

#elif означает иначе, если. Используется для построения if-else-if с целью определения различных опций компиляции.

За #elif следует константное выражение. Если оно истинно, то блок кода компилируется, и остальные выражения не проверяются, в противном случае рассматривается следующий блок.

Формат #elif

#if выражение

последовательность операторов

#elif выр.1

последовательность операторов

:

:

#elif выр. N

последовательность операторов

#endif

Пример. Данный фрагмент использует значение ACTIVE_COUNTRY для определения денежного знака.

#define US 0

#define ENGLAND 1

#define BR 2

# ACTIVE_COUNTRY US

#if ACTIVE_COUNTRY= =US

char currency[]=”dollar”;

#edif ACTIVE_COUNTRY= =ENGLAND

char currency[]=”pound”;

#else

char currency[]=”ZAYAC”;

#endif

#if и #elif могут быть вложенными. Если это имеет место, то каждый #endif, #else или #elif ассоциируется с ближайшим #if или #elif.

2.7.7.Директива #error.

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

Формат: #error сообщение об ошибке.

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

Fatal: имя_файла. Номер страницы: Error directive: сообщение об ошибке.

Здесь имя файла – это имя файла, где была обнаружена директива #error. Номер строки – номер строки директивы, а сообщение об ошибке – это собственно само сообщение.

2.8 Динамическое распределение памяти

Память для хранения данных может выделяться статически и динамически. Статическое распределение памяти выполняет компилятор, встретивший при компиляции имя объекта по типу и другим характеристикам, он вычисляет число байтов памяти, отводимое под данные. Класс хранения задаёт местами (сегмент данных или стек), где эти данные будут располагаться. Часто заранее неизвестно, сколько программа будет хранить объектов, а именно строк текста, чисел и т.д. В этом случае для хранения данных может использоваться специальное место, так называемая куча heap. Объём кучи и её месторасположение зависят от модели памяти. Ряд функций выполняют динамическое распределение памяти.

Функции библиотеки Borland C++ для динамического распределения памяти

Функции распределения

Соответствующая функция освобождения

Соответствующая функция перераспределения

Malloc

Free

Realloc

Calloc

Free

Realloc

Farmalloc

Farfree

Farrealloc

Farcalloc

Farfree

Farrealloc

При каждом обращении к функции распределения памяти выделяется запрошенное число байтов. Адрес начала выделенной памяти возвращается в точку вызова функции. Распределение памяти гарантируется от повторного выделения при следующих обращениях за байтами памяти. Если выделенный участок памяти больше не требуется, он может быть освобождён при высокой активности по динамическому распределению памяти, куча фрагментируется для смягчения отрицательных последствий фрагментации служат функции повторного распределения памяти. Они пытаются либо уменьшить, либо расширить размер ранее выделенного блока памяти. Модели памяти TINY,SMALL,MEDIUMвключают 2 кучи:near-кучу иfar-кучу. Остальные модели памяти имеют толькоTINY,SMALL,MEDIUM. Объёмnear-кучи не превышает 64 кБайт,far-куча занимает всю свободную оперативную память. Функцииmalloc,calloc,free,reallocиспользуютnear-кучу для моделей памятиTINY,SMALL,MEDIUM. Для других моделей памяти используютсяfar-куча. С ней работают функции с префиксомfar. Их поведение для модулей памятиCOMPACTи старше не отличается от функцийmalloc,calloc. И те и другие функции черпают память из одной и той же кучи и возвращаютfarуказатели на начало выделенных участков памяти. При использовании модулейSMALL,MEDIUMдоступ к выделеннойfar-кучи памяти требует явного описания указателя какfar. ДляBorlandC++, для динамического выделения и освобождения памяти использует также операторыnewdelete.