Вспоминаем Си. Отключаем (не)удобства assert

Есть такая удобная штука assert называется. Данный макрос вызывает исключение, которое позволяет провести частичную диагностику результатов работы программы.

Макрос проверяет истинность выражения, и если оно ложно пишет в поток stderr само выражение, имя файла и строку исходника, в котором это случилось. После вывода информации работа приложения завершается функцией abort().

Пишем сырец:

#include <windows.h>
#include <assert.h>

int main() {
    assert(false);
    return 0;
}

компилим, запускаем и что мы видим?
В консоли:

Assertion failed: false, file tt.cpp, line 9

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

плюс открывается окошко Error Report. Удобно? .. Мне — нет.

Почему так происходит? Начиная с Visual C++ 2005, функция abort() запускает механизм оповещения об ошибках. Почитав MSDN узнал, что отключить его можно установив флаги функцией _set_abort_behavior(). Там всего два флага:

  • _WRITE_ABORT_MSG — вкл./выкл. сообщение в консоли «This application…information.»
  • _CALL_REPORTFAULT — вкл./выкл. оповещение об ошибках

добавляем строчечку:

#include <windows.h>
#include <assert.h>

int main() {
    _set_abort_behavior(0, _CALL_REPORTFAULT|_WRITE_ABORT_MSG);
    assert(false);
    return 0;
}

компилим, запускаем… viola, никаких раздражающих окошек, в консоли только нужная нам информация.

Запись опубликована в рубрике Программирование с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий