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

C: ошибочно вложенные блоки переключателя/корпуса неожиданно работают

Я только что обнаружил следующий раздел в некотором коде, который я поддерживаю:

switch (m) {
    case 62: { // opening
        // some declarations
        // do some stuff
        break;
    case 63:
        // do some other stuff
        break;
        }      // closing
    default:
        // default stuff
        break;
 }   

Открытие блока предназначено для объявления некоторых локальных переменных, но закрывающая скобка ошибочно размещается и возникает после case 63.

Я никогда не замечал этого в течение нескольких месяцев, поскольку он хорошо компилируется в Visual Studio 2010. Я пробовал отлаживать его, и оба случая работают нормально.

Как это может быть? Является ли этот правильный синтаксис Си?

4b9b3361

Ответ 1

6.8.1 Обозначенные операторы, C99

Каждой инструкции может предшествовать префикс, объявляющий идентификатор как имя метки. Ярлыки сами по себе не изменяют поток который продолжает беспрепятственно перемещаться по ним.

то есть. Кудрявые фигурные скобки не влияют на работу меток ярлыков switch-case, а просто создают новую область.

Это объясняет, почему кажущиеся неуместными фигурные скобки не приводят к синтаксической ошибке.

Ответ 2

Операторы case аналогичны метокам goto и поэтому допускается синтаксис. Устройство Duff является известным прецедентом.

Старайтесь избегать этого.

Ответ 3

Удивительно, что это правильный синтаксис по языковому стандарту. Вы даже можете это сделать:

switch (m) break;

или это:

switch (m);

case const-expr: работает почти как обычный ярлык, который вы используете с goto.