Обеспечивает () - библиотека поддержки руководства

Я пытаюсь понять, как использовать Ensures() в коде. Как указано в примере, если бы я попытался использовать Ensures() следующим образом...

int main(void)
{
    int result = 0;
    // Some calculation
    Ensures(result == 255);
    return 0;
}

Если переменная result не равна 255, программа аварийно завершает работу со следующим выводом "terminate called without an active exception". Мой вопрос в том, как правильно использовать Ensures()?


person NJMR    schedule 01.04.2016    source источник
comment
Если в вашем примере вызывается std::terminate, то он работает как надо.   -  person Werner Henze    schedule 28.02.2020


Ответы (1)


Вы используете реализацию Microsoft GSL? Затем, если вы проверите заголовочный файл gsl_assert.h, вы увидите, что если определен GSL_TERMINATE_ON_CONTRACT_VIOLATION (по умолчанию), то Ensures вызовет std::terminate, который дать вам ошибку, которую вы получаете.

Если вы хотите, чтобы было выбрано исключение (с информацией о файле и номере строки), вам нужно определить GSL_THROW_ON_CONTRACT_VIOLATION перед включением GSL.

Что касается того, правильно ли вы используете Ensures, то да.


Обновления на 2021 год

GSL_TERMINATE_ON_CONTRACT_VIOLATION удален, всегда звонит terminate().

person Some programmer dude    schedule 01.04.2016
comment
Спасибо за ответ, проверю шапку. - person NJMR; 01.04.2016
comment
Я не использую MS GSL. Я пытался использовать MS GSL с Visual Studio 2013. Но получил фатальную ошибку C1001: в компиляторе произошла внутренняя ошибка. - person NJMR; 01.04.2016
comment
Согласно вашему предложению, я зашел в gsl-lite.h и изменил # define gsl_CONFIG_THROWS_FOR_TESTING 0 на # define gsl_CONFIG_THROWS_FOR_TESTING 1. Теперь я получаю исключение, которое могу его перехватить. Спасибо. - person NJMR; 01.04.2016
comment
По решению авторов Core Guideline MS GSL недавно удалила GSL_THROW_ON_CONTRACT_VIOLATION, а теперь всегда std::terminates. Но... дискуссия все еще продолжается, потому что Основные принципы кажутся противоречивыми в отношении поведения Expects. - person Werner Henze; 28.02.2020