Energy
education

сайт для тех, кто хочет изучать энергетику

23. Директивы препроцессора

Директивы препроцессора дают инструкции компилятора для предварительной обработки информации перед собственно компиляцией.

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

C# компилятор не имеет отдельный препроцессор, тем не менее, директивы обрабатываются, как если бы он там был. В C# директивы препроцессора используются, чтобы помочь в условной компиляции. В отличие от C и C + + директивы, они не используются для создания макросов. Директива препроцессора должна быть единственной инструкцией по линии.

Список директив препроцессора в C#

В следующей таблице перечислены директивы препроцессора доступны в C#:

Директивы препроцессораОписание
#defineОпределяет символ.
#undefПозволяет отменить определение символа.
#ifПозволяет тестировать символ или символы, чтобы увидеть, если они истина.
#elseПозволяет создавать директивы условий, наряду с #if.
#elifПозволяет создать составную условную директиву.
#endifОпределяет конец условной директивы.
#lineПозволяет изменить номер строки компилятора и (необязательно) вывод имени файла для ошибок и предупреждений.
#errorПозволяет создавать ошибку первого уровня из определенного места в коде.
#warningПозволяет создавать предупреждение первого уровня из определенного места в коде.
#regionПозволяет указать блок кода, который можно разворачивать и сворачивать с помощью функции структурирования в редакторе кода Visual Studio.
#endregionОтмечает конец блока #region.

Директива препроцессора #define

Директива препроцессора #define создает символьную константу.

#define позволяет определить символ, такой, что, используя символ как выражение передаваемое директиве #if, оно будет вычисляться как истина. Синтаксис выглядит следующим образом:

    
#define symbol
    

Следующая программа иллюстрирует это:

    
#define PI 
using System;
namespace PreprocessorDAppl
{
   class Program
   {
      static void Main(string[] args)
      {
         #if (PI)
            Console.WriteLine("PI определено");
         #else
            Console.WriteLine("PI не определено");
         #endif
         Console.ReadKey();
      }
   }
}
    

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

    
PI определено
    

Условные директивы

Вы можете использовать директиву #if для создания условной директивы. Условные директивы полезны для проверки символов. Если выражение истина, компилятор вычисляет весь код между #if и следующей директивой.

Синтаксис для условной директивы:

    
#if symbol [operator symbol]...
    

Где, symbol это имя символа, который необходимо проверить. Вы также можете использовать true и false или перед символ с оператором отрицания.

operator symbol это оператор использующийся для проверки символа. Операторы могут быть одним из следующих:

  • == (равенство)
  • != (неравенство)
  • && (и)
  • || (или)

Можно также группировать символы и операторы внутри скобок. Условные директивы используются для компиляции кода при построении отладки или при компиляции для конкретной конфигурации. Условные директивы начинаются с директивы #if, а заканчиваются директивой#endif.

Следующая программа демонстрирует использование условных директив:

    
#define DEBUG
#define VC_V10
using System;
public class TestClass
{
   public static void Main()
   {
      #if (DEBUG && !VC_V10)
         Console.WriteLine("DEBUG определен");
      #elif (!DEBUG && VC_V10)
         Console.WriteLine("VC_V10 определен");
      #elif (DEBUG && VC_V10)
         Console.WriteLine("DEBUG и VC_V10 определен");
      #else
         Console.WriteLine("DEBUG и VC_V10 неопределен");
      #endif
      Console.ReadKey();
   }
}
    

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

    
DEBUG и VC_V10 определен