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?



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.


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


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:
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.