Разработка компиляторов

       

Препроцессор C#


В своей книге "Дизайн и эволюция языка С++" Бьярни Страуструп писал:

"...Я поставил себе целью изжить Cpp [препроцессор С++]. Но задача оказалась труднее, чем представлялось вначале. Сpp, возможно, и неудачен, но трудно найти ему лучше структурированную и более эффективную замену".

Программистам на С++ и сегодня приходится иметь дело с потенциально опасным механизмом препроцессирования, который может приводить к глобальным заменам во всей программе и от действия которого невозможно защититься структурным образом.

В C# эта проблема решена кардинальным образом. Препроцессор стал частью компилятора (т.е. перестал быть препроцессором в традиционном понимании этого слова), а из привычного набора макросов оставлены только следующие:

  • #define и #undef для определения идентификаторов и отмены определения (но без значений - для задания значений используется ключевое слово const )
  • Механизм условной компиляции, основанный на директивах #if , #else , #endif
  • Генерация предупреждений и ошибок с помощью макросов #warning и #error

В следующем примере мы продемонстрируем использование всех перечисленных выше механизмов препроцессора:

#define DEBUG

#if DEBUG && DEMO #error You cannot build a debug demo version

class Demo { public static void Main() { #if DEBUG Console.WriteLine("Starting the program... "); #endif } }



Содержание раздела