Будет ли #if RELEASE работать как #if DEBUG в C #?

277

Во всех примерах, которые я видел в директиве компилятора #if, они используют «DEBUG». Могу ли я использовать «RELEASE» таким же образом, чтобы исключить код, который я не хочу запускать при компиляции в режиме отладки? Код, который я хочу окружить этим блоком, рассылает множество электронных писем, и я не хочу случайно отправлять их при тестировании.

Брайан Салливан
источник
3
#if !DEBUGвыполняет ту же функцию, #if RELEASEчто и раньше. С другой стороны , #if DEBUGто #elseтогда , #endifесли есть другой код для запуска в режимах.
Nat

Ответы:

275

Нет, не будет, если вы не сделаете какую-то работу.

Важной частью здесь является то, чем на самом деле является DEBUG, и это своего рода константа, с которой может проверить компилятор.

Если вы проверите свойства проекта, на вкладке Build вы найдете три вещи:

  • Текстовое поле с надписью «Условные символы компиляции»
  • Флажок с надписью «Определить постоянную отладки»
  • Флажок с надписью «Определить константу TRACE»

Нет такого флажка, ни предопределенной константы / символа с именем RELEASE.

Однако вы можете легко добавить это имя в текстовое поле, помеченное условными символами компиляции, но перед этим убедитесь, что вы установили конфигурацию проекта в Release-mode, так как эти параметры указаны для каждой конфигурации.

Таким образом, в основном, если вы не добавите это в текстовое поле, #if RELEASEвы не получите никакого кода при любой конфигурации.

Лассе В. Карлсен
источник
393

RELEASE не определено, но вы можете использовать

#if (!DEBUG)
  ...
#endif
M4N
источник
2
Это не так, но, конечно, вы можете использовать оператор NOT таким образом. Не думал об этом, когда написал свой ответ.
Лассе В. Карлсен
4
Это так, но использование вашего решения более понятно и «более правильно», ИМХО.
Даниэль Шаффер
1
Тем более, что у вас может быть больше конфигураций, чем просто RELEASE и DEBUG - для некоторых моих проектов есть DEBUG, RELEASE и DEPLOY или DEV (DEBUG), TEST и PROD (RELEASE)
Адам Нофсингер,
Для всех, кто был смущен комментариями выше, неотредактированный ответ задавался вопросом, RELEASEбыл ли он определен.
Дан
41

Нет.

В то время как в конфигурации отладки есть DEBUGопределенная константа (автоматически определенная Visual Studio), в то время как для режима выпуска такой константы нет Проверьте настройки вашего проекта при сборке.

Выбор [Определить константу DEBUG] в Project -> Build подобен включению #define DEBUG в начале каждого файла.

Если вы хотите определить константу RELEASE для конфигурации релиза, перейдите по ссылке:

  • Свойства проекта -> Построить
  • Выберите режим выпуска
  • в текстовом поле Символы условной компиляции введите: RELEASE
Поп-каталин
источник
1
Нашел это очень полезным, так как теперь я определил константу RELEASE для моей конфигурации Release и константу TESTING для моей конфигурации Testing. Очень полезно для определения требуется https только для выпуска#if (RELEASE) [RequireHttps] #endif
tekiegirl
27

На моем VS установка (VS 2008) #if RELEASEне работает. Однако вы можете просто использовать#if !DEBUG

Пример:

#if !DEBUG
SendTediousEmail()
#endif
JaredPar
источник
10

Я никогда не видел этого раньше ... но я видел:

#if (DEBUG == FALSE)

и

#if (!DEBUG)

Это работа для тебя?

Пит Х.
источник
Символы препроцессора не имеют значений в C #; они просто «определены» или «не определены». Так что !будет работать только оператор, как в вашем втором примере.
Джонатон Рейнхарт
1
Согласно MSDN, вы можете использовать операторы, такие как ==, чтобы проверить на true или false. msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz
8

Вы можете использовать #if(!DEBUG)для этих целей.

Абдус Салам Азад
источник
Удачным для меня было желание использовать это в xamrian, спасибо за публикацию.
rogue39nin
4

«Поп-Каталин» понял это правильно. Управление определением на основе типа сборки обеспечивает большую гибкость. Например, вы можете иметь конфигурации «DEBUG», «DEMO» и «RELEASE» в одном решении. Это предотвращает необходимость дублирования программирования с двумя различными решениями.

Так что да #if RELEASEили #if (RELEASE)работает так же, как #if DEBUGкогда определен условный символ компиляции RELEASE.

Следующее взято из поста "Pop Catalin": Если вы хотите определить константу RELEASE для конфигурации релиза, перейдите по ссылке: * Свойства проекта -> Построить * Выбрать режим релиза * в текстовом поле Условные символы компиляции введите: RELEASE


источник
2

Я знаю, что это старый вопрос, но стоит упомянуть, что вы можете создавать свои собственные конфигурации вне DEBUG и RELEASE, такие как TEST или UAT.

Если затем на вкладке «Построение» на странице свойств проекта вы установите для «Условных символов компиляции» значение «ТЕСТ» (например), вы можете использовать такую ​​конструкцию, как

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

Вы можете использовать эту конструкцию по определенной причине, например, для разных клиентов, если у вас есть такая необходимость, или даже, например, для целых веб-методов. Мы также использовали это в прошлом, когда некоторые команды вызывали проблемы на определенном оборудовании, поэтому у нас есть конфигурация для приложения при развертывании на оборудовании X.

Fetchez la vache
источник
0

Вы можете создавать свои собственные условные символы времени компиляции (любое имя, которое вам нравится). Перейдите в «Диалог сборки проекта», расположенный в окне свойств проекта, пункт меню: Project -> [projectname] Properties ...

Вы также можете определить их "в верхней части файла кода C #". Подобно:

#define RELEASE
// or
#undef RELEASE

Вы можете использовать символ в выражении #if:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif
Король кофе
источник
-8

почему не просто

#if RELEASE
#undef DEBUG
#endif
Мэтт Дэвисон
источник
3
Нет константы с именем RELEASE, определенной Visual Studio в режиме выпуска.
Поп Каталин
1
/d:RELEASEтакже будет работать. Вы также можете добавить это к условным символам компиляции в разделе «Конфигурация выпуска» (вкладка «Свойства проекта»)
SliverNinja - MSFT