Условная компиляция даёт возможность программисту управлять выполнением директив препроцессора и компиляцией программного кода. Каждая условная директива препроцессора вычисляет значение целочисленного константного выражения. Операции преобразования типов, операция sizeof и константы перечислимого типа не могут участвовать в выражениях, вычисляемых в директивах препроцессора.
Условная директива #if во многом похожа на оператор if. Её синтаксис имеет вид:
#if условие фрагмент кода#endifВ этой записи условие является целочисленным выражением. Если это выражение возвращает не 0 (т.е. истинно), то фрагмент кода, заключённый между директивой #if и директивой #endif, компилируется. Если же выражение возвращает 0 (ложно), то этот фрагмент игнорируется и препроцессором, и компилятором. В условиях, помимо обычных выражений, можно использовать конструкцию
defined идентификаторdefined возвращает 1, если указанный идентификатор был определён директивой #define, или 0 в противном случае. Конструкций #if defined может быть заменена эквивалентной ей директивой #ifdef, а конструкция #if!defined – директивой #ifndef.
|
|
Можно использовать более сложные конструкции условных директив препроцессора при помощи директив #elif (эквивалентно else if в обычной структуре if) и #else. Условная компиляция может быть полезна во многих случаях: нередко в процессе отладки приложения в него полезно ввести различные отладочные метки, позволяющие следить за ходом выполнения работы. Также условная компиляция позволяет исключить зацикливание при циклических директивах #include, включающих в различных модулях заголовочные файлы друг друга.