Учись программированию на C++ Builder бесплатно!

Условная компиляция дает возможность программисту управлять выполнением директив препроцессора и компиляцией программного кода. Каждая условная директива препроцессора вычисляет значение целочисленного константного выражения. Операции преобразования типов, операция sizeof и константы перечислимого типа не могут участвовать в выражениях, вычисляемых в директивах препроцессора.

Условная директива препроцессора #if во многом похожа на оператор if. Ее синтаксис имеет вид:

#if условие
фрагмент кода
#endif

В этой записи условие является целочисленным выражением. Если это выражение возвращает не нуль (истинно), то фрагмент кода, заключенный между директивой #if и директивой #endif, компилируется. Если же выражение возвращает нуль (ложно), то этот фрагмент игнорируется и препроцессором, и компилятором.

В условиях, помимо обычных выражений, можно использовать конструкцию defined идентификатор defined возвращает 1, если указанный идентификатор ранее был определен директивой #define, и возвращает 0 в противном случае. Например, возможен следующий код:

#if defined Debug && !defined MyConst
фрагмент кода
#endif

Фрагмент кода будет выполняться, если ранее была записана директива #define Debug и не было директивы #define MyConst или эта директива была отменена директивой #undef MyConst. Конструкция #if defined может быть заменена эквивалентной ей директивой #ifdef, а конструкция #if defined директивой #ifndef.

Можно использовать более сложные конструкции условных директив препроцессора при помощи директив #elif (эквивалент else if в обычной структуре if) и else (эквивалент else в структуре if). Например, в коде фрагмент кода 1 будет компилироваться, если выполняется условие 1, фрагмент кода 2 будет компилироваться, если выполняется условие 2, а фрагмент кода 3 будет компилироваться, если не выполняется ни одно из предыдущих условий:

#if условие 1
фрагмент кода 1
#elif условие 2
фрагмент кода 2
#else
фрагмент кода 3
#endif

Условная компиляция может быть полезна во многих случаях. Например, нередко в процессе отладки приложения в него полезно ввести различные отладочные печати, позволяющие следить за ходом выполнения программы. Если вы не хотите, чтобы эти печати оставались в окончательном варианте программы, вы можете в разных местах приложения ввести конструкции вида:

#ifdef Debug
операторы отладки
#endif

Тогда, если в начале программы вы введете директиву #define Debug операторы отладки будут компилироваться и выполняться. Но когда вы уберете или закомментируете эту директиву #define, определяющую введенный вами идентификатор Debug, все операторы отладки исчезнут из текста. Можно поступить даже проще, ничего не изменяя в тексте, а оперируя опцией Conditionals на странице Directories/Conditionals диалогового окна Project Options.

Поделиться