- •Программирование на языке c
- •Включаемые файлы и области видимости, директивы препроцессора языка c
- •Основные теоретические сведения Область видимости программных объектов
- •Заголовочные (включаемые) файлы
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директива #undef
- •Условная компиляция.
- •Директивы условной компиляции #if, #elif, #else, #endif.
- •Оператор defined.
- •Управляющая директива #line.
- •Директива #error.
- •Директива #pragma.
- •Задание
- •Варианты задания предыдущей л.Р. (№3)
Директива #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 считается определенным.