Как установить assert в версии release в C/С++

Мне нужно только запустить сборку корабля, и мне нужно утверждать, что в определенном состоянии в сборке релиза обнаружена проблема. Как это сделать?

Ответы

Ответ 1

Почему бы просто не определить собственное утверждение:

#define assert(x) MessageBox(...);

Ответ 2

Невозможно определить макрос NDEBUG - вы можете сделать это локально вокруг утверждений, которые хотите оставить в сборке:

#undef NDEBUG
#include <assert.h>   // reinclude the header to update the definition of assert()

или сделайте все, что вам нужно, чтобы ваш процесс сборки не определял макрос NDEBUG в первую очередь.

Ответ 3

Просто вызовите непосредственно часть определения макроса assert, которая активна в режиме деблокирования.

Вы можете найти очень полезные определения для утверждений в С++ в эту замечательную статью Миро Самека. Затем вы можете настроить их немного, чтобы удовлетворить ваши потребности. Например, вы можете создать еще один макрос release_assert, который будет делать то же самое, что и assert, но независимо от того, находится ли он в режиме release или отладки.

Ответ 4

Поведение ASSERT по умолчанию - это прервать программу в конфигурации Debug, но в конфигурации Release она обычно становится нерабочей. Я считаю, что это делает это, проверяя наличие макроса препроцессора NDEBUG. Я не работаю в данный момент, поэтому не могу это проверить.

Я думаю, что самый простой способ - изменить конфигурацию Debug, чтобы превратить все оптимизации на тот же уровень, что и Release (O2 из памяти), а затем перестроить ваше программное обеспечение. Это даст вам эквивалентную производительность и скорость сборки Release, но она все равно определит макрос препроцессора NDEBUG, что означает, что все сбойные ASSERT все равно вызовут остановку программы. Не забудьте изменить уровень оптимизации позже, иначе у вас возникнет проблема с отладкой в ​​конфигурации Debug.

В общем случае, ASSERT следует использовать только для программирования предусловий и никогда не обрабатывать сбои в программном обеспечении для доставки. Вы хотите быстро выйти из строя во время разработки, но изящно перед пользователем.

Ответ 5

Мне нравится определять его, чтобы вывести какой-то тип assert_exception, полученный из std:: runtime_error. Затем поймайте его где-нибудь и сделайте что-нибудь полезное.

Ответ 6

На самом деле - я бы пошел с отправкой отладочной версии, если вы можете с ней жить. Если вам не нужна производительность версии, используйте отладочную версию. У него, как правило, меньше ошибок (это грубое упрощение, и если в программе нет ошибок, просто переход на выпуск не изменит этого, но из-за того, что компилятор делает в режиме отладки, ошибки могут не возникать и/или иметь менее серьезные последствия).

Возможно, возможно также оптимизировать только временные критические части вашей программы.

Он также может упростить отладку.

Ответ 7

При использовании Visual Studio вы можете определить определение предкомпилятора NDEBUG для активных утверждений в сборке Release.

Например, вы можете установить $(undefesTheNDEBUG) в своих настройках Projekt для параметра /U, а затем определить переменную среды undefesTheNDEBUG для NDEBUG (SET undefesTheNDEBUG = NDEBUG) или передать ее вместе с msbuild (/p: undefesTheNDEBUG = NDEBUG)