Если после #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