Страница 249 из 502
<b> #if EXPERIMENTAL && TRIAL</b>
<b> Console.Error.WriteLine("Проверка пробной экспериментальной версии.");</b>
<b> #else</b>
<b> Console.Error.WriteLine("Это не пробная экспериментальная версия.");</b>
<b> #endif</b>
<b> Console.WriteLine("Присутствует во всех версиях.");</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этой программы.
<b>Компилируется для экспериментальной версии.</b>
<b>Это не пробная экспериментальная версия.</b>
<b>Присутствует во всех версиях.</b>
В данном примере идентификатор TRIAL не определен, и поэтому часть #else второй условной последовательности кода не компилируется.
Обратите внимание на то, что директива #else обозначает конец блока директивы #if и в то же время — начало блока самой директивы #else. Это необходимо потому, что с любой директивой #if может быть связана только одна директива #endif. Более того, с любой директивой #if может быть связана только одна директива #else.
Обозначение #elif означает "иначе если", а сама директива #elif определяет последовательность условных операций if-else-if для многовариантной компиляции. После директивы #elif указывается идентификаторное выражение. Если это выражение истинно, то компилируется следующий далее кодовый блок, а остальные выражения директивы #elif не проверяются. В противном случае проверяется следующий по порядку блок. Если же ни одну из директив #elif не удается выполнить, то при наличии директивы #else выполняется последовательность кода, связанная с этой директивой, а иначе не компилируется ни один из кодовых блоков директивы #if. Ниже приведена общая форма директивы #elif.
<b>#if идентификаторное_выражение</b>
<b>последовательность операторов</b>
<b>#elif идентификаторное_выражение</b>
<b>последовательность операторов</b>
<b>#elif идентификаторное_выражение</b>
<b>последовательность операторов // . . .</b>
<b>#endif</b>
В приведенном ниже примере демонстрируется применение директивы #elif.
<b>// Продемонстрировать применение директивы #elif.</b>
<b>#define RELEASE</b>
<b>using System;</b>
<b>class Test {</b>
<b> static void Main() {</b>
<b> #if EXPERIMENTAL</b>
<b> Console.WriteLine("Компилируется для экспериментальной версии.");</b>
<b> #elif RELEASE</b>
<b> Console.WriteLine("Компилируется для окончательной версии.");</b>
<b> #else</b>
<b> Console.WriteLine("Компилируется для внутреннего тестирования.");</b>
<b> #endif</b>
<b> #if TRIAL && !RELEASE</b>
<b> Console.WriteLine("Пробная версия. ") ;</b>
<b> #endif</b>
<b> Console.WriteLine("Присутствует во всех версиях.");</b>
<b> }</b>
<b>}</b>
Этот код выдает следующий результат.
<b>Компилируется для окончательной версии.</b>
<b>Присутствует во всех версиях.</b>
С помощью директивы #undef удаляется определенный ранее идентификатор. Это, по существу, означает, что он становится "неопределенным". Ниже приведена общая форма директивы #undef.
<b>#undef <i>идентификатор</i></b>
Рассмотрим следующий пример кода.
<b>#define SMALL</b>
<b>#if SMALL </b>
<b>// . . .</b>
<b>#undef SMALL</b>
<b>// теперь идентификатор SMALL не определен.</b>
После директивы #undef идентификатор SMALL уже оказывается неопределенным.
Директива #undef применяется главным образом для локализации идентификаторов только в тех фрагментах кода, в которых они действительно требуются.
Директива #error вынуждает компилятор прервать компиляцию. Она служит в основном для отладки. Ниже приведена общая форма директивы #error.
<b>#еrror сообщение_об_ошибке</b>