Ответ 1
Почему бы просто не определить собственное утверждение:
#define assert(x) MessageBox(...);
Мне нужно только запустить сборку корабля, и мне нужно утверждать, что в определенном состоянии в сборке релиза обнаружена проблема. Как это сделать?
Почему бы просто не определить собственное утверждение:
#define assert(x) MessageBox(...);
Невозможно определить макрос NDEBUG - вы можете сделать это локально вокруг утверждений, которые хотите оставить в сборке:
#undef NDEBUG
#include <assert.h> // reinclude the header to update the definition of assert()
или сделайте все, что вам нужно, чтобы ваш процесс сборки не определял макрос NDEBUG в первую очередь.
Просто вызовите непосредственно часть определения макроса assert
, которая активна в режиме деблокирования.
Вы можете найти очень полезные определения для утверждений в С++ в эту замечательную статью Миро Самека. Затем вы можете настроить их немного, чтобы удовлетворить ваши потребности. Например, вы можете создать еще один макрос release_assert
, который будет делать то же самое, что и assert, но независимо от того, находится ли он в режиме release или отладки.
Поведение ASSERT по умолчанию - это прервать программу в конфигурации Debug, но в конфигурации Release она обычно становится нерабочей. Я считаю, что это делает это, проверяя наличие макроса препроцессора NDEBUG. Я не работаю в данный момент, поэтому не могу это проверить.
Я думаю, что самый простой способ - изменить конфигурацию Debug, чтобы превратить все оптимизации на тот же уровень, что и Release (O2 из памяти), а затем перестроить ваше программное обеспечение. Это даст вам эквивалентную производительность и скорость сборки Release, но она все равно определит макрос препроцессора NDEBUG, что означает, что все сбойные ASSERT все равно вызовут остановку программы. Не забудьте изменить уровень оптимизации позже, иначе у вас возникнет проблема с отладкой в конфигурации Debug.
В общем случае, ASSERT следует использовать только для программирования предусловий и никогда не обрабатывать сбои в программном обеспечении для доставки. Вы хотите быстро выйти из строя во время разработки, но изящно перед пользователем.
Мне нравится определять его, чтобы вывести какой-то тип assert_exception, полученный из std:: runtime_error. Затем поймайте его где-нибудь и сделайте что-нибудь полезное.
На самом деле - я бы пошел с отправкой отладочной версии, если вы можете с ней жить. Если вам не нужна производительность версии, используйте отладочную версию. У него, как правило, меньше ошибок (это грубое упрощение, и если в программе нет ошибок, просто переход на выпуск не изменит этого, но из-за того, что компилятор делает в режиме отладки, ошибки могут не возникать и/или иметь менее серьезные последствия).
Возможно, возможно также оптимизировать только временные критические части вашей программы.
Он также может упростить отладку.
При использовании Visual Studio вы можете определить определение предкомпилятора NDEBUG для активных утверждений в сборке Release.
Например, вы можете установить $(undefesTheNDEBUG) в своих настройках Projekt для параметра /U, а затем определить переменную среды undefesTheNDEBUG для NDEBUG (SET undefesTheNDEBUG = NDEBUG) или передать ее вместе с msbuild (/p: undefesTheNDEBUG = NDEBUG)