Условная компиляция позволяет строить гибкие программы на языке Си. Это средство особенно часто используется при разработке программ, которые должны переноситься на различные процессоры, в различные операционные системы и в прочие операционные среды.
- #if
- #else
- #elif (аналогично else if)
- #endif
- #ifdef
- #ifndef
В основном, условная компиляция выполняется следующим образом:
если это-и-это истинно
вставить указанные здесь операторы в исполнимую программу
Можно задать и ветвь иначе.
Директивы #if используются для вставки строк в файл, в случае, если истинно некоторое константное выражение.
Для вставки строк при условии, что константа не имеет определения, вместо директивы #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