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. }

В целом, вещь весьма полезная, которая убирает разночтения и человеческий фактор.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

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