Подтвердить что ты не робот

Переключатель без корпуса

Сегодня я случайно обнаружил, что мой компилятор не жалуется при написании кода внутри оператора switch без случая. (Он жаловался на отсутствие заявлений о делах, но после добавления одного после кода было не так много, как предупреждение, чтобы сообщить мне, что код бесполезен.)

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

#include <iostream>
void foo() {
   std::cout << "foo" << std::endl;
}

int main()
{
   for (int a = -10; a < 10; ++a)
   {
      switch(a)
      {
         foo();
      case 4:
         std::cout << "4" << std::endl;
      }
   }
}

Теперь он выводит "4", как ожидалось, когда a == 4, и он никогда не выводит foo. Итак, вопрос в том, есть ли какая-то (потенциально эзотерическая, но полезная) причина, чтобы допустить утверждение foo(); до первого случая? Я точно знаю, что мне запрещено объявлять и инициализировать переменные там.

(FWIW, я тестировал это на нескольких компиляторах, и все они приносят одинаковое поведение. Удивительно, но они также не выдают предупреждение.)

4b9b3361

Ответ 1

Да, поведение такое же, как и на языке, и вы можете добавлять код в разных местах. Операторы switch намного сложнее, чем внешний вид, и они позволяют использовать довольно эзотерический код, имеет ли смысл смысл или нет.

Если вы хотите потратить некоторое время на некоторые странные использования switch и расположение случаев, вы можете посмотреть на реализацию сопрограмм в библиотеке boost asio. Вы можете написать небольшую функцию с помощью макросов, скомпилировать и посмотреть, как выглядит сгенерированный код (после макрорасширения).

Ответ 2

Из MSDN: -

Заявления могут появляться во главе составного оператора, образующего тело коммутатора, но инициализации, включенные в объявления, являются Не выполнена. Оператор switch передает управление непосредственно исполняемый оператор внутри тела, минуя строки, содержащие инициализацию.