- 1. Застосування
Винятки викидаються під час виконання програми, якщо помилка може бути знайдена під час компіляції програми, то можна використовувати 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, щоб він враховував кількість учасників перерахування з новим учасником.