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

Например, в этом фрагменте кода используется идентификатор 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, будет скомпилирована.

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

#include <iostream>

using namespace std;

#define TOM

int main()

{

 #ifdef TOM

  cout << "Программист Том.\n";

 #else

  cout << "Программист неизвестен.\n";

 #endif

 #ifndef RALPH

  cout << "Имя RALPH не определено.\n";

 #endif

 return 0;

}

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

Программист Том.

Имя RALPH не определено.

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

Программист неизвестен.

Имя RALPH не определено.

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

Директива #undef

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

#undef макроимя

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

#define TIMEOUT 100

#define WAIT 0

 // . . .

#undef TIMEOUT

#undef WAIT

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

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

Использование оператора defined

Помимо директивы #ifdef существует еще один способ выяснить, определено ли в программе некоторое макроимя. Для этого можно использовать директиву #if в сочетании с оператором времени компиляции defined. Например, чтобы узнать, определено ли макроимя MYFILE, можно использовать одну из следующих команд препроцессорной обработки.