Существует несколько директив условной компиляции, позволяющих изменить порядок компиляции в зависимости от состояния системы. Данный процесс называется условной компиляцией и широко используется при разработке коммерческого программного обеспечения, предоставляющего и поддерживающего много различных версий одной и той же программы.
Условная компиляция – это выборочная компиляция только тех частей программы, которые удовлетворяют некоторым условиям. Например, могут быть откомпилированы только те части программы, которые относятся к определённому окружению. Условная компиляция имеет следующие преимущества:
Позволяет задавать параметры времени компиляции, то есть можно создавать программы различных конфигураций.
Приводит к эффективному использованию памяти, так как ненужный код не хранится в памяти во время выполнения.
Решение о включении той или иной части программы принимается на этапе компиляции, а не во время выполнения. Это повышает эффективность программы (но уменьшает её гибкость).
Для условной компиляции используется препроцессорная директива #if. Она имеет 2 формы:
1.без else части.
заголовок_ if
оператор1
#endif
2.с else частью
заголовок_if
оператор1
#else
оператор2
#endif
где #endif используется для обозначения конца блока if
Здесь заголовок_if содержит условие в зависимости от значения, которое выполняется оператор1 или оператор2. Оператор1 выполняется если условие в заголовке_if истинно, оператор2 если ложно.
Заголовок_if имеет 3 формы:
#if константное выражение.
Если константное выражение отличается от 0, условие истинно, если равно 0, условие ложно.
#ifdef.
Условие истинно, если идентификатор предварительно был определён с помощью директивы #define (и не было для него директивы #undef). В противном случае ложно.
#ifndef
Условие истинно, если идентификатор не был определён ранее с помощью директивы #define (или был определён, а затем к нему была применена директива #undef).
Пример. Условная компиляция.
#ifndef SIZE
#define SIZE 128
#endif
В результате переменная SIZE получает значение, если ранее она не была определена программистом.
Рекомендации по программированию.
При использовании вложенных директив условной компиляции многие компиляторы не допускают смещения вправо #if и #else. Они все должны начинаться с первой позиции.
Пример.
#ifndef MAX
оператор
#else
#if MAX= =100
оператор
#else
оператор
#endif
#endif
Пример демонстрации условной компиляции, определяется символический идентификатор RAZM_BUF в зависимости от значения переменных A,B,C.
#if A
#define RAZM_BUF 4096
#endif
#if B
#define RAZM_BUF 1024
#endif
#if C
#define RAZM_BUF 512
#endif
2.7.6.Директива #elif.
#elif означает иначе, если. Используется для построения if-else-if с целью определения различных опций компиляции.
За #elif следует константное выражение. Если оно истинно, то блок кода компилируется, и остальные выражения не проверяются, в противном случае рассматривается следующий блок.
Формат #elif
#if выражение