Программирование на C и C++

Онлайн справочник программиста на C и C++

#if, #else, #elif и #endif

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

#if константное_выражение
последовательность операторов
#endif

Например:
/* простой пример с #if */
#include <stdio.h>
#define MAX 100
int main(void)
{
#if MAX>99
printf("Compiled for array greater than 99.\n");
#endif
return 0;
}

Данная программа выводит сообщение на экран, поскольку, как определено в программе, МАХ имеет значение больше 99. Данный пример демонстрирует очень важный момент: выражение, следующее зa #if, вычисляется на этапе компиляции, следовательно, оно должно содержать ранее определенные идентификаторы и константы, а не переменные.

Работа #else во многом похожа на работу оператора else — она предоставляет альтернативный вариант, если #if содержит ложное состояние. Предыдущий пример можно расширить следую­щим образом:

/* простой пример с #if / #else */
#include <stdio.h>
#def ine MAX 10
int main(void)
{
# if MAX>99
printf("Compiled for array greater than 99.\n");
#else
printf("Compiled for small array.\n");
#endif
return 0;
}

В данном случае MAX определяется так, чтобы значение было меньше 99, в результате чего ком­пилируется не код, соответствующий #if, а код, соответствующий #else. Следовательно, выводится сообщение «Compiled for small array».

Обратим внимание, что #else используется для обозначения конца блока #if и начала блока #else. Это делается потому, что может быть только один #endif, связанный c #if.

#elif означает «иначе если» и используется для построения лесенки if-else-if с целью определе­ния различных опций компиляции. За #elif следует константное выражение. Если выражение истинно, то блок кода компилируется и остальные выражения не проверяются. В противном слу­чае рассматривается следующий блок. Стандартный вид #elif следующий:

#if выражение
последовательность операторов
#elif выражение 1
последовательность операторов
#elif выражение 2
последовательность операторов
#elif выражение 3
последовательность операторов
#elif выражение 4
последовательность операторов
...
#elif выражение N
последовательность операторов
#endif

Например, следующий фрагмент использует значение ACTIVE_COUNTRY для определения де­нежного знака:

#define US 0
#define ENGLAND 1
#define FRANCE 2
#define ACTIVE_COUNTRY US
#if ACTIVE_COUNTRY==US
char currency[] = "dollar";
#elif ACTIVE_COUNTRY==ENGLAND
char currency[] = "pound";
#else
char currency[] = "franc";
#endif

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

#if МАХ>100
#if SERIAL_VERSION int port = 198;
#elif
int port = 200;
#endif
#else
char out_buffer[100] ;
#endif

В Borland С++ в операторе #if можно использовать оператор времени компиляции sizeof. На­пример, следующая программа определяет, компилируется программа для больших или малень­ких массивов:

#if (sizeof(char *) == 2)
printf("Program compiled for small array.");
#else
printf("Program compiled for large array.");
#endif