Переключатель без корпуса
Сегодня я случайно обнаружил, что мой компилятор не жалуется при написании кода внутри оператора 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, я тестировал это на нескольких компиляторах, и все они приносят одинаковое поведение. Удивительно, но они также не выдают предупреждение.)
Ответы
Ответ 1
Да, поведение такое же, как и на языке, и вы можете добавлять код в разных местах. Операторы switch намного сложнее, чем внешний вид, и они позволяют использовать довольно эзотерический код, имеет ли смысл смысл или нет.
Если вы хотите потратить некоторое время на некоторые странные использования switch
и расположение случаев, вы можете посмотреть на реализацию сопрограмм в библиотеке boost asio. Вы можете написать небольшую функцию с помощью макросов, скомпилировать и посмотреть, как выглядит сгенерированный код (после макрорасширения).
Ответ 2
Из MSDN: -
Заявления могут появляться во главе составного оператора, образующего тело коммутатора, но инициализации, включенные в объявления, являются Не выполнена. Оператор switch передает управление непосредственно исполняемый оператор внутри тела, минуя строки, содержащие инициализацию.