Kompilierungsfehler mit: Schalter, "erwarteter Ausdruck vor"

79

Auf den Punkt gebracht Ich habe mein Problem neu erstellt, da es ziemlich selbsterklärend ist.

dies entspricht fehlerfrei:

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

Dies wird mit Fehler kompiliert und es fehlt nur das NSLog ():

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

Beim Kompilieren wird ein Fehler ausgelöst: " Erwarteter Ausdruck vor 'NSString' "

Vermisse ich hier etwas?

Ross
quelle
Ich erinnere mich an eine switch / case-Anweisung mit einem ähnlichen Fehler, die früher verschwand, wenn ich irgendwo im case-Block einen Kommentar hinzufügte. Magic
Yunus Nedim Mehel

Antworten:

164

In normalem C müssten Sie dies in beiden Fällen in Klammern setzen. Ich vermute, dies könnte Ihr Problem beheben:

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

Weitere Informationen finden Sie in dieser SO-Frage .

Eine andere Möglichkeit, dieses Problem zu umgehen, besteht darin, eine Anweisung zwischen das Falletikett und die erste Deklaration zu setzen, wie Sie es in Ihrem obigen Arbeitsbeispiel getan haben. Weitere Informationen finden Sie in den Kommentaren und in der Antwort von Quinn Taylor.

Dan Olson
quelle
1
Interessant. Ich habe den Bracket-Ansatz nicht ausprobiert.
Eimantas
Ja, das behebt das Problem. Ich habe gerade mit der Code-Füllung von xcode gearbeitet, die sie nicht verwendet. Vielen Dank.
Ross
Ich bin auf dieses Problem gestoßen, ich habe es mit {} selbst gelöst, gut zu sehen, dass es die richtige Lösung war. +1 für dich Dan.
David Wong
20
Sie müssen nicht unbedingt Klammern verwenden. Das Setzen einer leeren Anweisung ( ;) nach dem caseBeschriften funktioniert ebenfalls. Der Grund für den Fehler und der Grund, warum beide Lösungen funktionieren, ist, dass ein Etikett, einschließlich eines caseEtiketts, nur einer Aussage vorangehen kann. Erklärungen sind keine Aussagen in C (C99 §6.7, §6.8, §6.8.2) und Objective-C, daher können Sie eine Erklärung nicht unmittelbar vor einer Erklärung anbringen. Daher die Lösungen: Setzen Sie entweder eine Anweisung (wie ;oder NSLog(@"");) zwischen das Label und die Deklaration oder schließen Sie die Deklaration in eine zusammengesetzte Anweisung (die Klammern) ein, die dem Label folgt.
Peter Hosey
Danke, diese Antwort hilft
inix
22

Sie können eine Variable nicht als erste Anweisung in a caseohne Klammern und in vielen anderen Kontexten in C-basierten Sprachen deklarieren . Weitere Informationen finden Sie unter Deklarieren von Variablen in einer switch-Anweisung .

Quinn Taylor
quelle
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
quelle