Для чего используется директива "#if" в c # и что означают "символы"? - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь понять, как оператор #if работает на C # и как он используется.

После прочтения некоторой документации я пришел к выводу, что она используется для компиляции кода в нем, если "символ" в условии определен.

#if DEBUG
    Console.WriteLine("Debug version");
#endif

Проблема здесь в том, что я не знаю, что они подразумевают под «символом» (в данном случае DEBUG), и я изо всех сил пытаюсь найти ответ из-за широкого значения этого слова.

Что это за «символы» и какова цель этих «директив препроцессора»?

Ответы [ 5 ]

2 голосов
/ 01 апреля 2019

Как уже говорили, это директива препроцессора.Код внутри #if DEBUG ... #endif будет условно скомпилирован , в зависимости от того, определен ли символ DEBUG.

В этом случае DEBUG - это просто символическое имя, введенное в частности для препроцессора, чтобы он мог различать блоки кода, которые должны или не должны компилироваться.

Вы можете определить новый символ препроцессора в настройках проекта:

Project settings dialog

Здесь мы определили четыре символа:

  • DEBUG
  • TRACE
  • ANOTHER_SYMBOL
  • YET_ANOTHER_SYMBOL

DEBUG и TRACE являются особенными, потому что они так широко распространены.Вот почему у них есть специальные флажки.Термин «постоянный» здесь используется взаимозаменяемо с термином «символ».Однако в этом конкретном контексте я чаще слышу «символ».

Еще один способ определить символ - использовать код.Вы можете добавить #define директивы в самом начале ваших исходных файлов .cs:

#define YET_ANOTHER_SYMBOL
1 голос
/ 01 апреля 2019

Это Директивы препроцессора . В вашем случае, он проверит, определен ли символ DEBUG, говоря #define DEBUG, тогда фрагмент кода Console.WriteLine будет выполнен

#if DEBUG
    Console.WriteLine("Debug version");
#endif
0 голосов
/ 01 апреля 2019

«Символы» в данном контексте означают идентификаторы, которые называются «символами условной компиляции» и полезны только для директивы #if.

Вы можете установить их:

  • ВVS из свойств проекта-> build-> условных символов компиляции (как писал @HimBromBreere) отмечает, что для часто используемых символов DEBUG и TRACE установлены флажки
  • В командной строке компилятора с параметром -define
  • В коде с директивой #define
0 голосов
/ 01 апреля 2019

В дополнение к предопределенному, вы также можете определить свой собственный символ условной компиляции либо на уровне файла, либо на уровне проекта:

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?redirectedfrom=MSDN&view=netframework-4.7.2

например, введите его в поленачало файла для определения «CONDITION1»

#define CONDITION1

или определения их в свойствах проекта -> build -> Условные символы компиляции.Здесь вы также можете увидеть предопределенные константы «debug» и «trace» (если проверено для вашей конфигурации).

0 голосов
/ 01 апреля 2019

Как вы уже предполагали, DEBUG -символ равен , используемому компилятором для того, чтобы либо перевести код, либо нет.Таким образом, в Release-build - где DEBUG не существует - код не скомпилирован в IL.

Символ здесь означает переменную, введенную в компилятор .Они определены в свойствах проекта VS -> Build -> условные символы компиляции.Однако существует набор предопределенных символов, таких как DEBUG.

...