Директива #define
определяет последовательность символов, называемую #if
или #elif
и поэтому используется для управления процессом компиляции. Ниже приведена общая форма директивы #define
.
#define идентификатор
Обратите внимание на отсутствие точки с запятой в конце этого оператора. Между директивой #define
и идентификатором может быть любое количество пробелов, но после самого идентификатора должен следовать только символ новой строки. Так, для определения идентификатора EXPERIMENTAL служит следующая директива.
#define EXPERIMENTAL
------------------------------------
ПРИМЕЧАНИЕ
В C/C++ директива #define может использоваться для подстановки исходного текста, например для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора.
------------------------------------
Обе директивы, #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("Присутствует во всех версиях.");
}
}
Эта программа дает следующий результат.
Компилируется для экспериментальной версии.
Проверка пробной экспериментальной версии.
Присутствует во всех версиях.