Switch-case не компилируется после комментирования неиспользуемой строки

82

Вот мой код:

который компилируется нормально.

Однако, когда я комментирую эту строку:

Я получу:

Что мне не хватает?

Корай Тугай
источник
Может заголовок этого вопроса надо отредактировать? Может ли кто-нибудь более опытный сделать это, если согласен?
Корай Тугай
Вы должны иметь возможность редактировать его самостоятельно, если хотите. Но согласен, название могло быть получше.
QuestionC
@KorayTugay, я попробовал.
Пол Дрейпер,
1
Наличие объявления переменной внутри case(без окружающих фигурных скобок, как было предложено в верхнем ответе) - плохая идея, потому что тогда имя переменной будет видно позже, caseно оно будет неинициализированным (если вы не упали).
MM

Ответы:

111

Технически говоря, каждый case в операторе switch является меткой. По некоторым неясным и старым причинам вам не разрешается указывать объявление переменной в качестве первой строки после метки. Комментируя задание

линия

становится первой строкой после метки, AF_INET:что, как я уже сказал, недопустимо в C.

Решение состоит в том, чтобы заключить все операторы case в фигурные скобки, например:

В любом случае, я думаю, что это лучшая практика кодирования.

Джон М
источник
22
Ницца. Придирчивый "Каждый случай ... это ... заявление с пометкой". И в этом причина: утверждения можно пометить, но не объявления.
undur_gongor 09
4
@KorayTugay Иногда сообщения компилятора не так информативны, как мы хотим ... иногда они слишком информативны (кашель, кашель, C ++, stl, кашель, кашель).
John M
5
@BlueMoon Вы правы. Когда вы можете купить инструмент для упрощения сообщений об ошибках C ++ stl, вы знаете, что плотность информации невероятно мала!
John M
3
или просто переместите объявления перед блоком переключения
Павел Гатнар 09
3
@immibis: в C ++ декларации - это операторы, поэтому в C ++ вы можете помечать объявления без каких-либо ограничений. В C объявления не являются операторами, поэтому их нельзя маркировать. Вот пример, иллюстрирующий эту разницу между C и C ++: stackoverflow.com/a/19830820/187690
AnT
15

В дополнение к принятому ответу вы можете объявить свои переменные перед метками case.

Или просто используйте пустой оператор.

Матиас Маркес
источник