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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.