Читать «C++: базовый курс» онлайн - страница 331

Herbert Schildt

// Пример использования директив #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

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

#define JOHN 0

#define BOB 1

#define TOM 2

#define COMPILED_BY JOHN

#if COMPILED_BY == JOHN

 char who[] = "John";

#elif COMPILED_BY == BOB

 char who[] = "Bob";

#else

 char who[] = "Tom";

#endif

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

#if COMPILED_BY == BOB

 #if DEBUG == FULL

  int port = 198;

 #elif DEBUG == PARTIAL

  int port = 200;

 #endif

#else

 cout << "Боб должен скомпилировать код" << "для отладки вывода данных.\n";

#endif

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

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

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

#ifdef макроимя

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

#endif

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

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

#ifndef макроимя

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

#endif

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