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