@Vadimatorikda
Инженер-программист, embedded разработчик

Как вывести из constexpr функции сообщение об ошибке и прервать компиляцию (C++1y; C++14)?

Имеется некоторая constexpr функция, которая проверяет параметры входной структуры. В случае, если какой-то параметр задан неверно, требуется вывести сообщение об ошибке с максимально подробным логом.
Для этих целей было бы удобно использовать printf или нечто подобное, но все эти методы запрещены в constexpr. Сейчас использую следующий способ:
constexpr const pll_cfg* rcc::pll_main_configuration_check ( const pll_cfg* const cfg, uint8_t count ) {
    // Проверяем все имеющиеся структуры конфигурации основного PLL.
    for ( int loop = 0; loop < count; loop++ ) {
        // Ошибка в одной из структур pll_cfg, параметр M.
        if ( ( cfg[loop].m < 2 ) || ( cfg[loop].m > 63 ) )
            throw("Structure has an invalid parameter M! M >= 2 and M <= 63!");

Однако при использовании throw невозможно указать конкретно номер структуры (переменную loop), в которой произошла ошибка. Максимум, компилятор укажет на эту строку и выдаст следующее сообщение.
error: expression '<throw-expression>' is not a constant-expression
  • Вопрос задан
  • 407 просмотров
Решения вопроса 1
@Vadimatorikda Автор вопроса
Инженер-программист, embedded разработчик
Ответ оформлен в виде статьи на хабре: https://habrahabr.ru/post/331468/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы