Я использую VC++. assert(false) игнорируется в режиме выпуска?





IIRC, assert (x) - это макрос, который ничего не оценивает, когда определен NDEBUG, который является стандартом для сборок Release в Visual Studio.
Я думаю, только если будет определен NDEBUG (который будет по умолчанию для приложений Visual C++).
Макрос assert (по крайней мере, обычно это макрос) обычно определяется как no-op в коде выпуска. Это сработает только в отладочном коде. Было сказано, что. Я работал в местах, которые определяли свой собственный макрос assert, и он запускался как в режиме отладки, так и в режиме выпуска.
Меня учили использовать утверждения для условий, которые «никогда» не могут быть ложными, например, предварительные условия для функции.
Я считаю ошибкой слишком полагаться на точное поведение утверждения. Правильная семантика assert (expr):
Подробнее на http://nedbatchelder.com/text/assert.html
Правильная семантика описана в ISO C.Если утверждения включены (NDEBUG не определен до включения <assert.h>), тогда, если управляющее выражение assert сравнивается с нулем, печатаются текст выражения, файл и номер строки. в некотором сообщении, определяемом реализацией, в стандартном потоке ошибок. Затем вызывается функция abort. (Начиная с C99, сообщение также должно включать имя функции.)
то же самое для GNU:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
В документации говорится: «Подпрограмма assert доступна как в выпускной, так и в отладочной версиях библиотек времени выполнения C». Однако, глядя на заголовок assert.h, очевидно, что определение NDEBUG перед его включением приведет к тому, что assert () будет скомпилирован без операции. Однако вполне возможно, что код режима выпуска, который не определяет NDEBUG, может вызвать прерывание утверждения. Я просто хотел прояснить собственное понимание и поделиться тем, что я нашел.