Switch-case nie skompiluje się po skomentowaniu nieużywanej linii

82

Oto mój kod:

który kompiluje się dobrze.

Jednak kiedy komentuję tę linię:

Wezmę:

czego mi brakuje?

Koray Tugay
źródło
Może należałoby zredagować tytuł tego pytania? Czy ktoś bardziej doświadczony może to zrobić, jeśli się na to zgodzi?
Koray Tugay
Jeśli chcesz, powinieneś móc go edytować samodzielnie. Ale zgadzam się, tytuł mógłby być lepszy.
Pytanie C
@KorayTugay, rzuciłem się na to.
Paul Draper
1
Posiadanie deklaracji zmiennej wewnątrz case(bez otaczających nawiasów, jak sugeruje górna odpowiedź) jest złym pomysłem, ponieważ wtedy nazwa zmiennej będzie widoczna w późniejszych casesekundach, ale pozostanie niezainicjalizowana (chyba, że ​​spadłeś).
MM,

Odpowiedzi:

111

Z technicznego punktu widzenia każdy przypadek w instrukcji przełącznika jest etykietą. Z pewnych niejasnych i starych powodów nie możesz mieć deklaracji zmiennej jako pierwszej linii po etykiecie. Komentując zadanie

linia

staje się pierwszą linią po etykiecie, AF_INET:która, jak powiedziałem, jest nielegalna w C.

Rozwiązaniem jest zawinięcie wszystkich instrukcji case w nawiasy klamrowe, jak poniżej:

W każdym razie myślę, że to lepsza praktyka kodowania.

John M.
źródło
22
Miły. Nitpicking "Każdy przypadek ... jest ... oświadczeniem z etykietą". I to jest powód: oświadczenia mogą być etykietowane, ale nie deklaracje.
undur_gongor
4
@KorayTugay Czasami komunikaty kompilatora nie zawierają informacji tak, jak byśmy chcieli ... czasami są zbyt pouczające (kaszel kaszel C ++ stl kaszel kaszel).
John M
5
@BlueMoon Masz rację. Kiedy można kupić narzędzia do uproszczenia komunikaty o błędach STL C ++ wiesz gęstość informacji jest bardzo niska!
John M
3
lub po prostu przenieś deklaracje przed blokiem przełączników
Pavel Gatnar
3
@immibis: W C ++ deklaracje są instrukcjami, dlatego w C ++ można etykietować deklaracje bez żadnych ograniczeń. W C deklaracje nie są instrukcjami, dlatego nie można ich nazwać. Oto przykład, który ilustruje tę różnicę między C i C ++: stackoverflow.com/a/19830820/187690
AnT
15

Jako uzupełnienie zaakceptowanej odpowiedzi możesz zadeklarować swoje zmienne przed etykietami przypadków.

Lub po prostu użyj pustego stwierdzenia.

Matías Marquez
źródło