Вывод описания ошибки в стандартном assert


ramok аватар

ramok - Posted on 25 Февраль 2009

Стандартный макрос assert() в C применяется для внутренних допущений в фунции, которые всегда должны выполнятся. Иначе они являются последствиями программной ошибки. Например вызов фунции не с тем параметром или повредилась память.

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

Например имеем файлик assert.c:

#include <stdio.h>
#include <assert.h>
 
int main()
{
    assert(2 + 2 == 4 && "описание ошибки если 2 + 2 не равно 4");
    assert(2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5");
    return 0;
}

Тестируем что получится:

ramok@~tests/ make assert && ./assert
cc -W -Wall assert.c   -o assert
assert: assert.c:7: main: Assertion `2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5"' failed.
[1]    29464 abort (core dumped)  ./assert

Для тех кто не понял как это работает:

  • В С нет булевских типов. Его заменет любой тип. Если переменая равна нулю то это false, если переменна не равно нулю - это true.
  • Вместо строки "описание ошибки если 2 + 2 не равно 4" компилятор подставляет указатель на строку, которую размещает где то в памяти. Так как указатель указывает на какое то место в памяти, он имеет значение отличное от нуля. Значит права сторона условия всегда true.
  • А значит, благодаря &&, assert сработает только в случае false в первой половине условия. Что там и нужно.

0
Ваша оценка: Ничего

Также можно сделать по-следующему:

assert (("Message", a == b));

Подставляем вместо "Message" - сообщение, вместо "a == b" - проверяемое выражение.
Как работает: составной оператор "," группирует несколько операторов, а его значением становится значение последнего оператора, в него входящего.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.