С++ - Урок 012. static_assert, проверка на ошибки во время компиляции

C++11, static_assert

Исключения выбрасываются во время выполнения программы, если же ошибка может быть найдена во время компиляции программы, то можно использовать static_assert , который сообщит о необходимости поправить программный код в ключевых местах.

Использование static_assert будет выглядеть следующим образом.

static_assert(4<=sizeof(int), "integers are too small"); // проверка размера integer

Синтаксис будет следующим static_assert(A, B); где

  • A - это условие, при котором будет выбрасываться ошибка в том случае, если A равно false
  • B - это текст сообщения об ошибке

Применение

static_assert может быть полезен при использовании констант и константных выражений, которые вычисляются на этапе компиляции.

В данном коде делается проверка локальной константной скорости, которая не может быть быстрее скорости света.

constexpr double C = 299792.458; // km/s, скорость света

void f(double speed)
{
    const double local_max = 160.0/(60∗60); // 160 km/h == 160.0/(60*60) km/s
    static_assert(speed<C,"can't go that fast"); // error: speed должна быть константой
    static_assert(local_max<C,"не может двигаться быстрее"); // OK
}

Также ещё можно использовать данную проверку в ключевых местах для перечислений. Например, дано такое перечисление.

enum Types
{
    E_BEGIN_TYPES,
        E_A = E_BEGIN_TYPES,
        E_B,
        E_C,
        E_D,
    E_END_TYPES = E_D
};

И есть следующий метод или функция в каком-то месте кода

QString getStandardMessage(Types type)
{
    static_assert(E_END_TYPES == 3, "Need to implement method for new type");

    switch (type)
    {
        case E_A: return "Type A";
        case E_B: return "Type B";
        case E_C: return "Type C";
        case E_D: return "Type D";
        default: return "Type is not implemented";
    }
}

В данном случае мы знаем, что самые последние перечисления, то есть E_D или E_END_TYPES будут равны 3. И исключение во время компиляции выброшено не будет. Но как только будет добавлен новый участник данного перечисления.

enum Types
{
    E_BEGIN_TYPES,
        E_A = E_BEGIN_TYPES,
        E_B,
        E_C,
        E_D,
        E_E, // Новый участник перечисления
    E_END_TYPES = E_E
};

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

QString getStandardMessage(Types type)
{
    static_assert(E_END_TYPES == 4, "Need to implement method for new type");

    switch (type)
    {
        case E_A: return "Type A";
        case E_B: return "Type B";
        case E_C: return "Type C";
        case E_D: return "Type D";
        case E_E: return "Type E";
        default: return "Type is not implemented";
    }
}

В данном методе мы добавим реализацию кода для типа E_E, а также поправим сам static_assert, чтобы он учитывал количество участников перечисления с новым участником.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
g
29 мая 2020 г. 14:32
glushchenkoin

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:40баллов,
  • Очки рейтинга-8
АС
26 мая 2020 г. 11:29
Артём Сун-Дун-Чан

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
МН
25 мая 2020 г. 11:33
Митя Нагибин

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
29 мая 2020 г. 13:00
Евгений Легоцкой

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Думал так, но похоже что нет. {{ post.votes.likes.user.username }} Это же QuerySet будет, а не отдельный единственный объект {% for vote in post.votes %} {{ vote.user.username …
29 мая 2020 г. 11:43
Владислав Меленчук

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

А как получить имя пользователя, который поставил лайк? Думал так, но похоже что нет. {{ post.votes.likes.user.username }}
29 мая 2020 г. 6:30
Евгений Легоцкой

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

У меня работает. Исправлял в проекте, который приложен к статье. А что происходит в вашем коде, с учётом места вызова этого кода, я знать не могу ;) Дебажьте и добавляйте условия, кото…
МА
29 мая 2020 г. 6:27
Михаил А

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

QModelIndexList rowIndexes = ui->tableView->selectionModel()->selectedRows(); model->removeRows(rowIndexes.first().row(), rowIndexes.size()); model-&…
Сейчас обсуждают на форуме
РС
30 мая 2020 г. 15:41
Руслан Склюев

Минимальный размер Item

Здравствуйте, новичек в QML. Раньше у меня было несколько окон и минимальный размер считал так: minimumHeight: loGeneral.implicitHeight + 2 loGeneral.anchors.margins minimumWid…
S
РС
30 мая 2020 г. 11:49
Руслан Склюев

QML Как при нажатии на кнопку изменить название окна?

У меня три файла: 1. QML - это Loader и Window 2. QML вход в программу - страница Loader (там есть Switch) 3. QML - MainMenu. Мне нужно в (1), чтобы если на (2) Switch.enable, то …
ДК
29 мая 2020 г. 13:27
Джон Кофи

QMap<> какой ключ лучше

это ясно. Вопрос в том, как быстро мапа будет отрабатывать, если ключом будет QModelIndex. Какой параметр индекса возьмет за ключ. И вот насколько это будет медленнее или быстрее, чем QString пр…
ДК
29 мая 2020 г. 11:10
Джон Кофи

QModelIndex становится не действительным, но валидный

Привет. Есть проблема с индексом и для меня это чистая магия: Сначала, что делаю: на вьюхе есть редактируемые ячейки. Пользователь редактирует одну, потом внезапно решает не сохраниться и ш…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB