Switch-case не компілюється після коментування невикористаного рядка


82

Ось мій код:

який складає чудово.

Однак коли я коментую цей рядок:

Я отримаю:

Чого мені не вистачає?


Можливо, слід відредагувати заголовок цього питання? Чи може хтось досвідченіший зробити це, якщо з цим погодиться?
Корай Тугай

Якщо ви хочете, ви зможете редагувати його самостійно. Але я згоден, заголовок може бути кращим.
QuestionC

@KorayTugay, я побіг.
Пол Дрейпер

1
Наявність декларації змінної всередині case(без оточуючих фігурних дужок, як пропонується у верхній відповіді) - погана ідея, оскільки тоді ім'я змінної буде видно пізніше case, але воно буде неініціалізоване (якщо ви не випадали).
MM

Відповіді:


111

Кожен випадок у операторі switch є, технічно кажучи, ярликом. З ясних та старих причин вам не дозволяється мати декларацію змінної як перший рядок після мітки. Коментуючи завдання

лінія

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

Рішення полягає в тому, щоб обговорити всі ваші заяви у фігурні дужки так:

У будь-якому випадку, я думаю, що це краща практика кодування.


22
Приємно. "Кожен випадок ... це ... позначена мітка". І в цьому причина: висловлювання можна позначати ярликами, але не декларації.
undur_gongor

4
@KorayTugay Іноді повідомлення компілятора не є інформативними, як ми хочемо, щоб вони були .... іноді вони занадто інформативні (кашель кашель C ++ stl кашель кашель).
Джон М

5
@BlueMoon Ви маєте рацію. Коли ви можете придбати інструмент для спрощення повідомлень про помилки C ++ stl, ви знаєте, що щільність інформації неймовірно низька!
John M

3
або просто перемістити декларації перед блоком перемикачів
Павел Гатнар,

3
@immibis: У C ++ декларації - це оператори, саме тому в C ++ ви можете позначати декларації без будь-яких обмежень. У деклараціях C не є операторами, саме тому ви не можете їх мітити. Ось приклад , який ілюструє цю різницю між C і C ++: stackoverflow.com/a/19830820/187690
AnT

15

Як доповнення до прийнятої відповіді ви можете оголосити свої змінні перед мітками регістру.

Або просто скористайтеся порожнім твердженням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.