Пустой «релиз» макросов ASSERT вылетает из программы? - PullRequest
6 голосов
/ 16 ноября 2011

Посмотрите на этот код:

#include <cassert>

#ifdef DEBUG
#define ASSERT(expr) assert(expr)
#else
#define ASSERT(expr)
#endif /* DEBUG */

Программа запустится, только если я определил DEBUG, в противном случае она будет зависать и завершаться без результатов.Я использую MinGW в Eclipse Indigo CDT.Совет ценится!

Ответы [ 2 ]

8 голосов
/ 16 ноября 2011

Трудно сказать, не глядя на реальный код, который вызывает проблему. Мое предположение: вы оцениваете выражение с побочными эффектами в пределах ASSERT(). Например, ASSERT( ++i < someotherthing ) в цикле. Вы можете подтвердить это, временно изменив определение макроса до expr в NDEBUG сборках. После того, как вы подтвердите причину, перейдите на каждый ASSERT звонок, который вы делаете, чтобы убедиться, что выражения не имеют побочных эффектов.

7 голосов
/ 16 ноября 2011

Вы почти наверняка злоупотребляете утверждениями . Выражение утверждения никогда не должно иметь побочных эффектов .

Когда вы говорите assert(initialize_critical_space_technology());, а затем пропускаете всю эту строку в сборке релиза, вы можете вообразить для себя, что произойдет.

Единственный безопасный и разумный способ использовать утверждения - это значения:

const bool space_init = initialize_critical_space_technology();
assert(space_init);

Некоторые люди вводят макрос VERIFY для чего-то, что всегда выполняет код:

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