Błąd kompilacji z: przełącznik, „oczekiwane wyrażenie przed”

79

Przechodząc do sedna, odtworzyłem swój problem, ponieważ jest on dość oczywisty.

to jest zgodne bez błędu:

switch (n) {
    case 1:
        NSLog(@"");
        NSString *aStr;
        break;
    default:
        break;
    }

to kompiluje się z błędem i brakuje tylko NSLog ():

switch (n) {
    case 1:
        NSString *aStr;
        break;
    default:
        break;
    }

zgłasza błąd podczas kompilacji " Oczekiwano wyrażenia przed 'NSString' "

Czy coś mi umyka?

Ross
źródło
Pamiętam oświadczenie dotyczące przełącznika / przypadku z podobnym błędem, znikało, gdy
dodałem

Odpowiedzi:

164

W normalnym C musiałbyś ująć to w nawiasy w obu przypadkach. Podejrzewam, że to może rozwiązać twój problem:

case 1:
{
    NSLog(@"");
    NSString *aStr;
    break;
}

Zobacz to pytanie SO, aby uzyskać więcej informacji.

Innym sposobem obejścia tego problemu jest umieszczenie oświadczenia między etykietą przypadku a pierwszą deklaracją, tak jak w powyższym przykładzie roboczym. Zobacz komentarze i odpowiedź Quinna Taylora, aby uzyskać więcej informacji.

Dan Olson
źródło
1
Ciekawy. Nie próbowałem podejścia wspornikowego.
Eimantas
Tak, to rozwiązuje problem. Po prostu działałem z wypełnieniem kodu xcode, które ich nie używa. Dzięki.
Ross
Spotkałem się z tym problemem wcześniej, rozwiązałem go sam {}, dobrze widzieć, że to było poprawne rozwiązanie. +1 dla ciebie Dan.
David Wong,
20
Nie musisz koniecznie używać nawiasów. Umieszczenie pustej instrukcji ( ;) po caseetykiecie również działa. Przyczyną błędu i powodem, dla którego oba rozwiązania działają, jest to, że etykieta, w tym caseetykieta, może tylko poprzedzać instrukcję. Deklaracje nie są instrukcjami w C (C99 §6.7, §6.8, §6.8.2) i Objective-C, więc nie możesz umieścić etykiety bezpośrednio przed deklaracją. Zatem rozwiązania: Albo umieść instrukcję (taką jak ;lub NSLog(@"");) między etykietą a deklaracją lub zawiń deklarację wewnątrz instrukcji złożonej (nawiasy) po etykiecie.
Peter Hosey,
Dzięki, ta odpowiedź pomaga
inix
22

Nie możesz zadeklarować zmiennej jako pierwszej instrukcji w a casebez nawiasów, a także w wielu innych kontekstach w językach opartych na C. Aby uzyskać szczegółowe informacje, zobacz Deklarowanie zmiennych w instrukcji switch .

Quinn Taylor
źródło
3
case 0: {
    Loading my nib file;
    break; 
}
case 1: {
    Loading another nib file;
    break; 
}
Note that if you don't have an assignment (x = y) right after the case it won't be a problem. For example:
kiran kumar
źródło