Чи буде #if ЗВ'ЯЗКУ працювати так, як #if DEBUG робить у C #?


277

У всіх прикладах, які я бачив у директиві компілятора #if, вони використовують "DEBUG". Чи можна використовувати "RELEASE" таким же чином, щоб виключити код, який я не хочу запускати, коли компілюється в режимі налагодження? Код, яким я хочу оточити цей блок, надсилає купу електронних листів, і я не хочу випадково надсилати їх під час тестування.


3
#if !DEBUGвиконує таку ж функцію, як #if RELEASEі у вас. З іншого боку , #if DEBUGто #elseтоді , #endifякщо є інший код для запуску в режимах.
Nat

Відповіді:


275

Ні, це не буде, якщо ви не виконаєте якусь роботу.

Важливою частиною тут є те, що насправді є DEBUG, і це якась константа, визначена компілятором.

Якщо ви перевірите властивості проекту, на вкладці "Збірка" ви знайдете три речі:

  • Текстове поле з написом "Умовні символи компіляції"
  • Поставити прапорець "Визначити константу DEBUG"
  • Поставити прапорець "Визначити константу TRACE"

Немає такої прапорці, а також попередньо визначеної константи / символу, яка має назву ВИПУСК.

Однак ви можете легко додати це ім'я до текстового поля, позначеного умовними символами компіляції, але переконайтесь, що ви встановили конфігурацію проекту в режимі випуску, перш ніж робити це, оскільки ці налаштування відповідають конфігурації.

Отже, якщо ви не додасте це до текстового поля, #if RELEASEне буде створюватися жоден код у будь-якій конфігурації.


393

RELEASE не визначено, але ви можете використовувати

#if (!DEBUG)
  ...
#endif

2
Це не так, але, звичайно, ви можете використовувати оператор NOT таким чином. Я не думав про це, коли писав свою відповідь.
Лассе В. Карлсен

4
Так, але використання вашого рішення зрозуміліше і "правильніше", ІМХО.
Даніель Шаффер

1
Тим більше, що у вас може бути більше конфігурацій, ніж просто звільнення та відлагодження - для деяких моїх проектів є DEBUG, RELEASE та DEPLOY or DEV (DEBUG), TEST та PROD (RELEASE)
Адам Нофсінгер

Для всіх, хто збентежений коментарями вище, неопублікована відповідь цікавила, чи RELEASEвизначено це.
День

41

Ні.

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

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

Якщо ви хочете визначити константу RELEASE для конфігурації випуску, перейдіть до:

  • Властивості проекту -> Створити
  • Виберіть Режим випуску
  • в текстове поле Умовних символів компіляції введіть: ЗВІЙТИ

1
Це вважає дуже корисним, оскільки я зараз визначив константу RELEASE для моєї конфігурації випуску та константу TESTING для моєї конфігурації тестування. Дуже корисні для визначення потрібні https лише для випуску#if (RELEASE) [RequireHttps] #endif
tekiegirl

27

На моєму встановленні VS (VS 2008) #if RELEASEне працює. Однак ви могли просто скористатися#if !DEBUG

Приклад:

#if !DEBUG
SendTediousEmail()
#endif

10

Я ніколи цього не бачив ... але я бачив:

#if (DEBUG == FALSE)

і

#if (!DEBUG)

Що працює для тебе?


Символи попереднього процесу не мають значення в C #; вони просто "визначені" або "не визначені". Так працює лише !оператор, як у вашому другому прикладі.
Джонатан Райнхарт

1
Згідно з MSDN, ви можете використовувати операторів типу == для перевірки на істинність чи хибність. 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 для конфігурації випуску, перейдіть до: * Властивості проекту -> Збірка * Виберіть режим випуску * в текстове поле Умовні компіляційні символи введіть: ЗВІЙТИ


2

Я знаю, що це давнє питання, але, можливо, варто згадати, що ви можете створювати власні конфігурації за межами DEBUG і RELEASE, наприклад TEST або UAT.

Якщо потім на вкладці Build на сторінці властивостей проекту ви встановите "Символи умовної компіляції" на TEST (наприклад), ви можете використовувати конструкцію, таку як

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

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


0

Ви можете створити власні умовні символи часу компіляції (будь-яке ім’я). Перейдіть до діалогового вікна "Створення проекту", що знаходиться у вікні властивостей проекту, параметр меню: Проект -> [Ім'я проекту] Властивості ...

Ви також можете визначити їх "у верхній частині файла коду 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.