Вывод описания ошибки в стандартном assert
Стандартный макрос 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 в первой половине условия. Что там и нужно.
- 2158 просмотров


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