Evgenii Legotckoi
23 жовтня 2018 р. 16:11

C++ 17 - атрибут [[fallthrough]].

Перейшли на роботі використання компілятора, який підтримує стандарт C++17.

Активно починаємо користуватися різними плюшками з цього стандарту.

Порадував атрибут [[fallthrough]] для switch case конструкцій.


Суть даного атрибуту в тому, що він вказує, що оператор break був пропущений навмисно в конструкції switch case і що це не є помилкою програміста.

Справа в тому, що конструкція switch case дозволяє наскрізне виконання програмного коду через всі варіанти вибору case , якщо не було додано оператор break .

Ось класичний варіант застосування даної конструкції

  1. int x = 100;
  2.  
  3. bool check_x()
  4. {
  5. switch (x)
  6. {
  7. case 0:
  8. return true;
  9. case 50:
  10. x = 0:
  11. break;
  12. case 100:
  13. return false;
  14. default:
  15. return false;
  16. }
  17. }

А ось варіант із наскрізним виконанням коду, коли пропущено оператора break.

  1. int x = 100;
  2.  
  3. bool check_x()
  4. {
  5. switch (x)
  6. {
  7. case 0:
  8. case 50:
  9. case 100:
  10. return true;
  11. default:
  12. return false;
  13. }
  14. }

В даному випадку для всіх значень 0, 50, 100 буде виконуватися той самий код. Але при цьому компілятор може видати попередження, інші програмісти, які можуть підтримувати ваш програмний код надалі, можуть вважати це помилкою.

Щоб вказати, що пропуск оператора break був зроблений намір, було введено атрибут fallthrough ,. І тоді цей програмний код виглядатиме так

  1. int x = 100;
  2.  
  3. bool check_x()
  4. {
  5. switch (x)
  6. {
  7. case 0:
  8. [[fallthrough]];
  9. case 50:
  10. [[fallthrough]];
  11. case 100:
  12. return true;
  13. default:
  14. return false;
  15. }
  16. }

Також можна інформувати компілятор, що оператор default був пропущений навмисно.

  1. int x = 100;
  2.  
  3. bool check_x()
  4. {
  5. switch (x)
  6. {
  7. case 0:
  8. [[fallthrough]];
  9. case 50:
  10. [[fallthrough]];
  11. case 100:
  12. return true;
  13. case 105:
  14. [[fallthrough]];
  15. }
  16. return false;
  17. }

В цілому, річ дуже корисна, яка прибирає різночитання та людський фактор.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…