Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4new.rtf
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
282.77 Кб
Скачать

Директива #undef

Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор

Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.

Пример:

#undef WIDTH

#undef MAX

Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.

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

Borland C поддерживает условную компиляцию, заменяя соответствующие строки исходного кода пустой строкой. Строки, которые начинаются с #, игнорируются (кроме директив #if, #ifdef, #ifndef, #else, #elif и #endif), также как все строки, которые не должны компилироваться как результат директив. Все директивы условной компиляции должны полностью находиться в исходном или во включаемом файле, в котором они начинаются.

Директивы условной компиляции #if, #elif, #else, #endif.

Директивы условной компиляции #if, #elif, #else, #endif работают как обычные условные операторы С. Они используются:

#if константное-выражение1

секция1

[#elif константное-выражение2 новая-строка секция2]

...

[#elif константное-выражениеn новая-строка секцияn]

...

[#else последняя-секция]

#endif

Если константное-выражение1 вычисляется не в 0 (true), строки кода (возможно пустые), представленные секцией1, либо это строки с командами препроцессора, либо это строки исходного кода обрабатываются препроцессором и передаются в компилятор Borland C. Иначе, если константное-выражение1 вычисляется в 0 (false), секция1 игнорируется (не макрорасширяется и не компилируется).

В случае true после препроцессорной обработки секции1 управление передается на соответствующую #endif (которая заканчивает условный эпизод), и продолжается со следующей секцией. В случае false управление передается на следующую #elif (если она есть) и вычисляется константное-выражение2 и т.д. Если true, то секция2 обрабатывается, после чего управление переходит на соответствующий #endif. В противном случае, если константное-выражение2 false, то управление переходит на следующую #elif, и т.д., до тех пор, пока не исчерпаются все #else или #endif. Необязательная #else используется как альтернативный вариант в случае, если все предыдущие тесты вычислялись в false. #endif заканчивает условную последовательность.

Секции могут содержать директиву условной компиляции, вложенную на любую глубину; каждая #if должна быть сбалансирована закрывающей #endif.

В результате действия директив условной компиляции только одна секция (возможно пустая) передается для дальнейшей обработки. Пропущенные секции годятся только для хранения следа вложенных условий, так что каждая директива #if получает соответствующую верную директиву #endif.

Константные выражения должны вычисляться в целое константное значение.

Оператор defined.

Оператор defined обеспечивает альтернативный, более гибкий способ проверки, была ли определена комбинация идентификаторов или нет. Он допустим только в выражениях #if и #elif.

defined(идентификатор)

Это выражение вычисляется в 1 (true), если символ идентификатор был предварительно определен (используя #define) и не был отключен (используя #undef); в противном случае он вычисляется в 0 (false). Так директива

#if defined (mysym)

аналогична

#ifdef mysym

Преимущество defined в том, что Вы можете использовать его в сложных выражениях в #if, таких как

#if defined(mysym) && !defined(yoursym)

Директивы условной компиляции #ifdef и #ifndef.

Директивы условной компиляции #ifdef и #ifndef позволяют Вам проверять определен идентификатор или нет, то есть, была ли обработана предыдущая команда #define для этого идентификатора и находится ли она еще в силе. Строка

#ifdef идентификатор

действует как

#if 1

если идентификатор определен, и действует как

#if 0

если идентификатор неопределен.

#ifndef

возвращает true для "неопределенного" условия, и строка

#ifndef идентификатор

действует как

#if 0

если идентификатор определен, и действует как

#if 1

если идентификатор неопределен.

Синтаксис использования такой же, как для #if, #elif, #else, #endif.

Идентификатор, определенный как NULL считается определенным.