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



 

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

 

Директивы #if, #else, #elif и #endif

 

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

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

Общая форма записи директивы #if выглядит так.

 

 

Если константное_выражение является истинным, код, расположенный непосредственно за этой директивой, будет скомпилирован. Рассмотрим пример.

 

 

При выполнении эта программа отобразит сообщение Требуется дополнительная память на экране, поскольку, как определено в программе, значение константы МАХ больше 10. Этот пример иллюстрирует важный момент: Выражение, которое стоит после директивы #if , вычисляется во время компиляции. Следовательно, оно должно содержать только идентификаторы, которые были предварительно определены, или константы. Использование же переменных здесь исключено.

Поведение директивы #else во многом подобно поведению инструкции else , которая является частью языка C++: она определяет альтернативу на случай невыполнения директивы #if . Чтобы показать, как работает директива #else , воспользуемся предыдущим примером, немного его расширив.

 

 

В этой программе для имени МАХ определено значение, которое меньше 10, поэтому #if ‑ветвь кода не скомпилируется, но зато скомпилируется альтернативная #else ‑ветвь. В результате отобразится сообщение Достаточно имеющейся памяти. .

Обратите внимание на то, что директива #else используется для индикации одновременно как конца #if ‑блока, так и начала #еlse ‑блока. В этом есть логическая необходимость, поскольку только одна директива #endif может быть связана с директивой #if .

Директива #elif эквивалентна связке инструкций else‑if и используется для формирования многозвенной схемы if‑else‑if , представляющей несколько вариантов компиляции. После директивы #elif должно стоять константное выражение. Если это выражение истинно, следующий блок кода скомпилируется, и никакие другие #elif ‑выражения не будут тестироваться или компилироваться. В противном случае будет проверено следующее по очереди #elif ‑выражение. Вот как выглядит общий формат использования директивы #elif .

 

 

Например, в этом фрагменте кода используется идентификатор COMPILED_BY , который позволяет определить, кем компилируется программа.

 

 

Директивы #if и #elif могут быть вложенными. В этом случае директива #endif , #else или #elif связывается с ближайшей директивой #if или #elif . Например, следующий фрагмент кода совершенно допустим.

 

Директивы #ifdef и #ifndef

 

Директивы #ifdef и #ifndef предлагают еще два варианта условной компиляции, которые можно выразить как "если определено" и "если не определено" соответственно.

 

Общий формат использования директивы #ifdef таков.

 

 

Если макроимя предварительно определено с помощью какой‑нибудь директивы #define , то последовательность инструкций , расположенная между директивами #ifdef и #endif , будет скомпилирована.

 

Общий формат использования директивы #ifndef таков.

 

 

Если макроимя не определено с помощью какой‑нибудь директивы #define , то последовательность инструкций , расположенная между директивами #ifdef и #endif , будет скомпилирована.

Как директива #ifdef , так и директива #ifndef может иметь директиву #else или #elif . Рассмотрим пример.

 

 

При выполнении эта программа отображает следующее.

 

 

Но если бы идентификатор ТОМ был не определен, то результат выполнения этой программы выглядел бы так.

 

 

И еще. Директивы #ifdef и #ifndef можно вкладывать точно так же, как и директивы #if .

 

Директива #undef

 

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

 

 

Рассмотрим пример.

 

 

Здесь имена TIMEOUT и WAIT определены до тех пор, пока не выполнится директива #undef .

Основное назначение директивы #undef – разрешить локализацию макроимен для тех частей кода, в которых они нужны.

 


Дата добавления: 2018-09-22; просмотров: 285; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!