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?



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.


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


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:
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.