Вы когда-нибудь использовали макрос assert в C или C++? Если нет, то вы должны попробовать это!

Это простой инструмент для отладки: вы можете добавить проверки в свой код, если ваше приложение находится в выделенном состоянии. Если это не так, ваше приложение остановится, но только когда вы создадите его в режиме отладки. В релизном режиме тесты будут игнорироваться.
В зависимости от вашей платформы это может немного отличаться. Например,
Qt-framework печатает сообщение журнала, если у вас есть неудачный тест утверждения для stderr, когда вы в настоящее время используете выпускную сборку.

С моей точки зрения, assert — хороший инструмент для проверки предварительных условий для ваших функций/методов во время разработки. И вы увидите, что ваше приложение аварийно завершает работу, когда это предварительное условие не выполняется. Благодаря некоторой магии препроцессора сам оператор будет напечатан на стандартный вывод. Итак, когда вы пишете что-то
вроде:

void foo( bar_t *my_ptr) {assert( nullptr!= ptr );}

и ваш указатель является указателем nullptr в вашем приложении, вы получите некоторую информацию о своем стандартном выводе, например:

assert in line 222, file bla.cpp: assert( NULL != ptr );

Отлично, вы видите, что не так, и вы можете начать исправлять эту ошибку. Но иногда вам нужно проверить более одного параметра или состояния:

global_state_t MyState = init;
global_state_t MyState = init;
void foo( bar_t *ptr ) {
assert( NULL != ptr && MyState == init );
...
}

Хорошо, ваше приложение все еще ломается, и вы все еще видите, что пошло не так?
К сожалению, нет, вы получите сообщение вроде:

assert in line 222, file bla.cpp: assert( nullptr != ptr && MyState == init );

Итак, что пошло не так, вы не сможете понять это с первого взгляда.
Потому что указатель может быть nullptr, или состояние может быть неправильным, или оба теста прошли неправильно. Нужно копнуть глубже, чтобы понять ошибку.
Для второго разработчика это будет сложнее, потому что он, скорее всего, не будет знать, какой случай ошибки он должен проверить в первую очередь, потому что он не писал код. Поэтому, когда вам нужно проверить более одного состояния, используйте более одного утверждения:

global_state_t MyState = init;
void foo( bar_t *ptr ) {
assert( NULL != ptr );
assert( MyState == init );
...
}

Спасибо!

Впервые опубликовано здесь: http://kimkulling.de/2016/01/27/please-use-only-one-statement-per-assert/