Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

Условная компиляция

Исходный файл [12] можно компилировать не целиком, а частями, используя директивы условной компиляции (рис. 9.5.).

#if LEVEL > 3

текст1

#elif LEVEL > 1

текст2

#else

текст3

#endif

Рис. 9.5. Использование условной компиляции

Предполагается, что LEVEL– это макроимя, поэтому выражение в директивах#ifи#elifможно вычислить во время обработки исходного текста препроцессором. Блок условной компиляции должен завершаться директивой#endif.

В каком-то смысле директива #ifпохожа на условный операторif. Однако, в отличие от него, условие – это константа, которая вычисляется на стадии препроцессора, и куски текста, не удовлетворяющие условию, просто игнорируются.

Директив #elifможет быть несколько (либо вообще ни одной), директива#elseтакже может быть опущена.

Директива #ifdef– модификация условия компиляции. Условие считается выполненным, если указанное после нее макроимя определено. Соответственно, для директивы#ifndefусловие выполнено, если имя не определено.

Дополнительные директивы препроцессора

Директива #pragmaиспользуется для выдачи дополнительных указаний компилятору. Например, не выдавать предупреждений при компиляции, или вставить дополнительную информацию для отладчика. Конкретные возможности директивы#pragmaу разных компиляторов различные.

Директива #errorвыдает сообщение и завершает компиляции. Например, директива#errorвыдаст сообщение и не даст откомпилировать исходный файл, если макроимяunixне определено (рис. 9.6).

#ifndef unix

#error "Программу можно компилировать только для Unix!"

#endif

Рис. 9.6. Использование директивы #error

Директива #lineизменяет номер строки и имя файла, которые хранятся в предопределенных макроименах__LINE__и__FILE__.

Кроме директив, у препроцессора есть одна операция ##, которая соединяет строки, напримерA ## B.

Тема 10 Структуры

10.1. Определение структур и доступ к элементам

Структуры– это составные типы данных, построенные с использованием других типов [1]. На рис. 10.1 показано определение структуры время:

struct Time

{

int hour;

int minute;

int second;

};

Рис. 10.1. Определение структурыTime

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

Определение Timeсодержит три элемента типаinthour,minute,second. Элементы структуры могут быть разного типа, и одна структура может содержать элементы многих разных типов. Структура не может содержать экземпляры самой себя. Например, элемент типаTimeне может быть объявлен в определении структурыTime. Однако может быть включен указатель на другую структуруTime. Структура, содержащая элемент, который является указателем на такой же структурный тип, называетсяструктурой с самоадресацией.

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

Time timeObject, timeArray[10], *timePtr;

объявляет timeObjectпеременной типаTime,timeArray– массивом с десятью элементами типаTime, аtimePtr– указателем на объект типаTime.