Директива условной компиляции

Эта директива позволяет компилятору исключить из обработки какие‑либо части исходного файла посредством проверки условий (константных выражений). Общий синтаксис директивы следующий:

#if ОКВ текст

<#elifОКВ текст>

<#elifОКВ текст>

<…>

<#else текст>

#endif

Здесь ОКВ — обозначение ограниченного константного выражения, специфика его будет раскрыта далее. Треугольные скобки, как обычно, обозначают необязательные элементы спецификации.

Директива управляет компиляцией частей исходного файла. Разрешается вложение условных директив. Каждой записи #if в том же исходном файле должна соответствовать завершающая запись #endif. Между ними допускается любое число директив #elif и не более одной директивы #else. Если ветвь #else присутствует, то между ней и #endif на данном уровне вложенности не должно быть других записей #elif.

Препроцессор выбирает один и только один участок текста для обработки на основе вычисления ограниченного константного выражения, следующего за каждой директивой условия. Выбирается весь текст, следующий за ограниченным константным выражением с ненулевым значением, вплоть до ближайшей записи #elif,#else, или #endif на данном уровне вложенности.

Текст может занимать более одной строки. Он может представлять собой фрагмент программного кода, но может использоваться и для обработки произвольного текста. Если текст содержит другие директивы препроцессора, они выполняются. Обработанный препроцессором текст передается на компиляцию. Все участки текста, не выбранные препроцессором, игнорируются и не порождают компилируемого кода.

Если все выражения, следующие за #if, #elif на данном уровне вложенности ложны (равны нулю), выбирается текст, следующий за #else. Если при этом ветвь #else отсутствует, никакой текст не выбирается.Ограниченное константное выражение не может содержать операций приведения типа, операций sizeof (возможна в некоторых компиляторах), констант перечисления и вещественных констант, но может содержать специальную препроцессорную операцию defined (идентификатор). Операция defined дает ненулевое значение, если заданный идентификатор в данный момент определен; в противном случае выражение равно нулю (ложно). Операция может использоваться в сложном выражении в директиве неоднократно:#if defined(name1) || defined(name2)

Приведем пример:

#if defined (COLOR)

color();

#elif defined (MONO)

mono();

#else

error();

#endif

Здесь условная директива управляет компиляцией одного из трех вызовов функции. Вызов функции color() компилируется, если определена именованная константа COLOR. Если определена константа MONO, компилируется вызов функции mono(), если ни одна из двух констант не определена, компилируется вызов функции error().

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: