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?


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.