Переключатель без дела

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

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

#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, я проверил это на нескольких компиляторах, и все они дают одинаковое поведение. Удивительно, но они также не выводят предупреждение.)

13

Решение

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

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

8

Другие решения

От MSDN: —

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

3

По вопросам рекламы [email protected]