Выбрать главу

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

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

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

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

 последовательность инструкций

#endif

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

// Простой пример использования директивы #if.

#include <iostream>

using namespace std;

#define MAX 100

int main()

{

 #if MAX>10

  cout << "Требуется дополнительная память\n";

 #endif

 // ...

 return 0;

}

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

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

// Пример использования директив #if/#else.

#include <iostream>

using namespace std;

#define MAX 6

int main()

{

 #if MAX>10

  cout << "Требуется дополнительная память.\n");

 #else

  cout << "Достаточно имеющейся памяти.\n";

 #endif

 // . . .

 return 0;

}

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

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

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

#if выражение

 последовательность инструкций

#elif выражение 1

 последовательность инструкций

#elif выражение 2

 последовательность инструкций

#еlif выражение 3

 последовательность инструкций

// . . .

#elif выражение N

 последовательность инструкций

#endif