Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_2_Книги).doc
Скачиваний:
4
Добавлен:
03.05.2019
Размер:
988.16 Кб
Скачать

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

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

    1. Директива #if.

Первая (сокращённая) форма директивы #if в общем виде записывается так:

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

последовательность операторов ( блок 1)

#endif

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

#define MAX 50

… /* здесь размещаются некоторые операторы */

#if MAX>100

cout<<” This text is compiled”;

… /* Здесь могут быть другие операторы */

#endif

… /* Здесь программа продолжается */

В результате препроцессорной обработки оператор

cout<<” This text is compiled”;

и, возможно, записанные в этом блоке другие операторы, не включаются в программу и компилироваться не будут, так как условие 50>100 ложно. Если значение макроса MAX изменить, например,

#define MAX 150,

то оператор вывода будет включён для компиляции, так как 150>100.

Вторая ( полная) форма директивы #if в общем виде записывается так:

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

последовательность операторов ( блок1)

#else

последовательность операторов ( блок2)

#endif

По аналогии с полной формой обычного оператора if в зависимости от значения константного выражения в компилируемую программу будет включён блок1 или блок2.

Для построения конструкции с вложенной директивой #if (лесенки if-else-if) используется директива #elif:

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

последовательность операторов ( блок1)

#elif константное_выражение2

последовательность операторов ( блок2)

#elif константное_выражение3

последовательность операторов ( блок3)

#elif константное_выражениеN

последовательность операторов ( блокN)

#else

последовательность операторов ( блок(N+1))

#endif

Если истинно i-е константное выражение, то для компиляции включается iблок, и остальные выражения не проверяются. В противном случае вычисляется и проверяется следующее выражение. Если все выражения ложны, то используется (N+1)-й блок, если есть директива #else. Если #else отсутствует, то в случае ложности всех выражений ни один из блоков в компиляции не участвует.

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

Упражнение. Привести пример полной формы директивы #if и вложенной директивы #if.