Чтение онлайн

ЖАНРЫ

Полное руководство. С# 4.0
Шрифт:

Директива #define определяет последовательность символов, называемую иденти фикатором. Присутствие или отсутствие идентификатора может быть определено с помощью директивы #if или #elif и поэтому используется для управления процес сом компиляции. Ниже приведена общая форма директивы #define. #define идентификатор

Обратите внимание на отсутствие точки с запятой в конце этого оператора. Между директивой #define и идентификатором может быть любое количество пробелов, но после самого идентификатора должен следовать только символ новой строки. Так, для определения идентификатора EXPERIMENTAL служит следующая директива. #define EXPERIMENTAL

ПРИМЕЧАНИЕ В C/C++ директива #define

может использоваться для подстановки исходного текста, на пример для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора. Директивы #if и #endif

Обе директивы, #if и #endif, допускают условную компиляцию последовательно сти кода в зависимости от истинного результата вычисления выражения, включающе го в себя один или несколько идентификаторов. Идентификатор считается истинным, если он определен, а иначе — ложным. Так, если идентификатор определен директивой #define, то он будет оценен как истинный. Ниже приведена общая форма директивы #if. #if идентификаторное_выражение последовательность операторов #endif

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

Идентификаторное выражение может быть простым, как наименование идентифи катора. В то же время в нем разрешается применение следующих операторов: !, ==, !=, && и ||, а также круглых скобок.

Ниже приведен пример применения упомянутых выше директив. // Продемонстрировать применение директив // #if, #endif и #define. #define EXPERIMENTAL using System; class Test { static void Main { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #endif Console.WriteLine("Присутствует во всех версиях."); } }

Этот код выдает следующий результат. Компилируется для экспериментальной версии. Присутствует во всех версиях.

В приведенном выше коде определяется идентификатор EXPERIMENTAL. Поэтому когда в этом коде встречается директива #if, идентификаторное выражение вычис ляется как истинное и затем компилируется первый оператор, содержащий вызов метода WriteLine. Если же удалить определение идентификатора EXPERIMENTAL и перекомпилировать данный код, то первый оператор, содержащий вызов метода WriteLine, не будет скомпилирован, поскольку идентификаторное выражение ди рективы #if вычисляется как ложное. Но второй оператор, содержащий вызов метода WriteLine, компилируется в любом случае, потому что он не входит в блок дирек тивы #if.

Как пояснялось выше, в директиве #if допускается указывать идентификаторное выражение. В качестве примера рассмотрим следующую программу. // Использовать идентификаторное выражение. #define EXPERIMENTAL #define TRIAL using System; class Test { static void Main { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #endif #if EXPERIMENTAL && TRIAL Console.Error.WriteLine ("Проверка пробной экспериментальной версии."); #endif Console.WriteLine("Присутствует во всех версиях."); } }

Эта программа дает следующий результат. Компилируется для экспериментальной версии. Проверка пробной экспериментальной версии. Присутствует во всех версиях.

В данном примере определены два идентификатора: EXPERIMENTAL и TRIAL. Вто рой оператор, содержащий вызов метода WriteLine, компилируется лишь в том случае, если определены оба идентификатора.

Для компилирования кода в том случае, если идентификатор не определен, можно воспользоваться

оператором !, как в приведенном ниже примере. #if !EXPERIMENTAL Console.WriteLine("Этот код не экспериментальный!"); #endif

Вызов метода будет скомпилирован только в том случае, если идентификатор EXPERIMENTAL не определен. Директивы #else и #elif

Директива #else действует аналогично условному оператору else языка С#, опре деляя альтернативный ход выполнения программы, если этого не может сделать ди ректива #if. С учетом директивы #else предыдущий пример программы может быть расширен следующим образом. // Продемонстрировать применение директивы #else. #define EXPERIMENTAL using System; class Test { static void Main { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #else Console.WriteLine("Компилируется для окончательной версии."); #endif #if EXPERIMENTAL && TRIAL Console.Error.WriteLine("Проверка пробной экспериментальной версии."); #else Console.Error.WriteLine("Это не пробная экспериментальная версия."); #endif Console.WriteLine("Присутствует во всех версиях."); } }

Вот к какому результату приводит выполнение этой программы. Компилируется для экспериментальной версии. Это не пробная экспериментальная версия. Присутствует во всех версиях.

В данном примере идентификатор TRIAL не определен, и поэтому часть #else вто рой условной последовательности кода не компилируется.

Обратите внимание на то, что директива #else обозначает конец блока дирек тивы #if и в то же время — начало блока самой директивы #else. Это необходи мо потому, что с любой директивой #if может быть связана только одна директива #endif. Более того, с любой директивой #if может быть связана только одна дирек тива #else.

Обозначение #elif означает "иначе если", а сама директива #elif определяет по следовательность условных операций if-else-if для многовариантной компиляции. После директивы #elif указывается идентификаторное выражение. Если это выраже ние истинно, то компилируется следующий далее кодовый блок, а остальные выраже ния директивы #elif не проверяются. В противном случае проверяется следующий по порядку блок. Если же ни одну из директив #elif не удается выполнить, то при наличии директивы #else выполняется последовательность кода, связанная с этой ди рективой, а иначе не компилируется ни один из кодовых блоков директивы #if.

Ниже приведена общая форма директивы #elif. #if идентификаторное_выражение последовательность операторов #elif идентификаторное_выражение последовательность операторов #elif идентификаторное_выражение последовательность операторов // ... #endif

В приведенном ниже примере демонстрируется применение директивы #elif. // Продемонстрировать применение директивы #elif. #define RELEASE using System; class Test { static void Main { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #elif RELEASE Console.WriteLine("Компилируется для окончательной версии."); #else Console.WriteLine("Компилируется для внутреннего тестирования."); #endif #if TRIAL && !RELEASE Console.WriteLine("Пробная версия."); #endif Console.WriteLine("Присутствует во всех версиях."); } }

Этот код выдает следующий результат. Компилируется для окончательной версии. Присутствует во всех версиях. Директива #undef

С помощью директивы #undef удаляется определенный ранее идентификатор. Это, по существу, означает, что он становится "неопределенным". Ниже приведена об щая форма директивы #undef. #undef идентификатор

Рассмотрим следующий пример кода. #define SMALL #if SMALL // ... #undef SMALL // теперь идентификатор SMALL не определен.

После директивы #undef идентификатор SMALL уже оказывается неопреде ленным.

Поделиться с друзьями: