Skip to the content.

assert


В коде настолько часто используются операторы условного ветвления для обнаружения ошибки и завершения программы, что в С++ решили сделать для этого отдельный оператор проверочного утверждения.

assert - это макрос препроцессора, который обрабатывает условное выражение во время выполнения. Если условие истинно, то ничего не происходит. Если условие ложное, то выводится сообщение об ошибке (содержит имя файла и номер строки с assert) и программа завершается.

Заголовочный файл: #include <cassert>

Часто используется для проверки корректности переданных параметров функции и проверки возвращаемого значения из функции. Самое частое использование на моей практике:

// функция: создает окно и возвращает результат выполнения
int result = createWindow(&handle, 600, 800, false);
assert(result >= 0); // result >= 0 означает ошибку при создании окна
// сама программа не рухнет, но продолжать работу с таким окном уже нельзя

Пример ошибки: Assertion failed: result >= 0, file C:\main.cpp, line 6

Есть небольшая хитрость, которая делает ошибку более подробной: к условию assert’a добавляют строку с комментарием через логический оператор or:

assert(result >= 0 && "createWindow fail");

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

Assertion failed: result >= 0 && "createWindow fail", file C:\main.cpp, line 6

Стоит отметить, что assert должен работать только в debug версии программы, а в release во время препроцессинга все assert’ы убираются. Поскольку код на момент релиза уже должен быть протестирован :). Что бы убрать все assert’ы нужно использовать макрос #define NDEBUG, зачастую он по умолчанию уже включен.

ВАЖНО: assert как и exit() немедленно завершают программу, без возможности выполнить очистки (например, закрыть файл).

static_assert (C++11)


Начиная с С++11 появился еще один тип _оператора проверочного утверждения__ - static_assert. В отличие от assert, он срабатывает во время компиляции, вызывая ошибку компиляции. Соответственно, условие static_assert’a тоже должна обрабатываться во время компиляции.