Условная компиляция — это средство препроцессора, которое в зависимости от условия включает в программу операторы языка Си или препроцессора.
Условная компиляция позволяет строить гибкие программы на языке Си. Это средство особенно часто используется при разработке программ, которые должны переноситься на различные процессоры, в различные операционные системы и в прочие операционные среды.
Условная компиляция реализуется с помощью следующих директив препроцессора:
В основном, условная компиляция выполняется следующим образом:
если это-и-это истинно
     вставить указанные здесь операторы в исполнимую программу
Можно задать и ветвь иначе.
Директивы #if используются для вставки строк в файл, в случае, если истинно некоторое константное выражение.
Директивы #ifdef используются для вставки строк, если определена указанная поименованная константа.
Для вставки строк при условии, что константа не имеет определения, вместо директивы #ifdef можно использовать директиву #ifndef.
Большинство препроцессоров Си включает предопределенную константу, имя которой указывает на используемый компьютер, со значением равным 1 (истина). Это надо проверять в документации используемого препроцессора.
Пример 1
#include "local.h"
#if vax||u3b
#define MAGIC 330
#elif u3b5
#define MAGIC 430
#elif u3b2
#define MAGIC 530
#else
#define MAGIC 500
#endif
Чтобы изменить значение используемой поименованной константы, следует применять директиву #undef перед изменяющей значение директивой #define (этого требуют многие препроцессоры). Не является ошибкой применение #undef к еще неопределенному идентификатору, либо переопределение макроса или поименованной константы той же самой строкой-шаблоном.
Пример 2
#ifdef LIMIT      /* #if определена константа LIMIT*/
#undef LIMIT
#endif
#define LIMIT 1000
Пример 3
f()
{
...
#ifdef DEBUG
   printf ("x=%d\n", x);
   printf ("y=%d\n", y);
#endif
...
}
Для запуска программы в режиме отладки надо включить в файл определение поименованной константы:
#define DEBUG
Тогда любые операторы, находящиеся между #ifdef DEBUG и #endif будут включены в исполнимый код. Возможно любое количество пар #ifdef и #endif. В системах UNIX константа DEBUG может быть определена не в программе, а в вызывающей ее командной строке:
$cc -DDEBUG prog.c