assert (false) игнорируется в режиме выпуска (VC ++)? - PullRequest
24 голосов
/ 07 ноября 2008

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

Ответы [ 6 ]

26 голосов
/ 07 ноября 2008

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

См. Заявить (CRT)

5 голосов
/ 07 ноября 2008

Макрос assert (по крайней мере, обычно это макрос) обычно определяется как no-op в коде выпуска. Это будет срабатывать только в отладочном коде. Было сказано, что. Я работал в местах, которые определяли свой собственный макрос assert, и он срабатывал как в режиме отладки, так и в режиме выпуска.

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

4 голосов
/ 07 ноября 2008

IIRC, assert (x) - это макрос, который ничего не оценивает при определении NDEBUG, который является стандартом для сборок Release в Visual Studio.

2 голосов
/ 07 ноября 2008

Я думаю, только если определен NDEBUG (что будет по умолчанию для приложений Visual C ++).

1 голос
/ 07 ноября 2008

Я думаю, что слишком полагаться на точное поведение утверждения слишком ошибочно. Правильная семантика «assert (expr)»:

  • Выражение expr может или не может быть оценено.
  • Если expr равно true, выполнение продолжается в обычном режиме.
  • Если expr равен false, то, что происходит, не определено.

Больше на http://nedbatchelder.com/text/assert.html

0 голосов
/ 23 марта 2012

то же самое для GNU:

  #ifdef    NDEBUG

  # define assert(expr)     (__ASSERT_VOID_CAST (0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...