2009-07-12 11 views
54

Ich glaube, ich werde blind, weil ich nicht herausfinden kann, wo der Syntaxfehler in diesem Code ist:Kann ich Variablen innerhalb einer Objective-C-Switch-Anweisung deklarieren?

if(cell == nil) { 
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero 
     reuseIdentifier:CellIdentifier ] autorelease 
    ]; 

    switch(cellNumber) { 
     case 1: 
      NSString *viewDataKey = @"Name"; 
etc... 

Wenn ich versuche, es zu kompilieren, erhalte ich ein Fehler: Syntaxfehler vor '*' Token in der letzten Zeile.

Sorry für so eine grundlegende Frage, aber was vermisse ich?

+1

Welche Variable Zellzahl? Die switch-Anweisung stammt von C, daher kann die Verwendung von Objective-C-Typen den Fehler auslösen. –

+1

C unterstützt nur integral-ähnliche Objekte für 'switch/case', und ich würde eine andere Fehlermeldung erwarten, wenn das hier das Problem wäre. – ephemient

+0

Verfolgt Objective-C C99 (und C++) und ermöglicht es Ihnen, Variablen an beliebiger Stelle zu deklarieren, oder können Sie dies nur zu Beginn eines Blocks tun?Wenn Sie gezwungen sind, sie am Anfang eines Blocks zu deklarieren, können Sie Ihren Syntaxfehler beheben, indem Sie ein '' '' nach dem '':'' von '' case 1: ''und ein passendes''} ''vor dem Ende des Falles. –

Antwort

66

ich keine geeignete Objective-C-Compiler zur Hand haben, aber solange die C-Konstrukte identisch sind:

switch { … } gibt Ihnen ein Block-Level-Umfang, nicht eine für jede case. Eine Variable an einer anderen Stelle als am Anfang des Bereichs zu deklarieren ist illegal, und innerhalb einer ist insbesondere gefährlich, weil ihre Initialisierung übersprungen werden kann.

Kann eines der folgenden Probleme behoben werden?

NSString *viewDataKey; 
switch (cellNumber) { 
    case 1: 
     viewDataKey = @"Name"; 
    … 
} 

switch (cellNumber) { 
    case 1: { 
     NSString *viewDataKey = @"Name"; 
     … 
    } 
    … 
} 
+2

wrt/'Eine Variable an einer anderen Stelle als am Anfang des Bereichs zu deklarieren ist unzulässig'. Dies ist in C99 nicht der Fall. C99 erlaubt beides und definiert die Semantik dessen, was passiert, wenn "Kontrolle über eine Deklaration springt" und der Wert dieser Deklaration in solchen Fällen. – johne

+0

Ich habe vergessen anzugeben, welche Option das Problem gelöst hat, oops. Ich habe die oberste verwendet, um das Problem zu lösen - ich glaube nicht, dass ich den zweiten Vorschlag getestet habe, was zu schade ist, weil Sie so aussehen, als hätten Sie eine tolle Diskussion! – JoBu1324

+0

Weitere Informationen darüber, warum diese funktionieren in http://stackoverflow.com/questions/1231198 –

1

Könnte es nicht zulässig sein, eine Variable innerhalb eines Switchblocks zu deklarieren?

+0

Wie ich auf Chucks Antwort bemerkte: 'switch (0) {int i; } 'ist gültig C89, und Objective-C ist eine echte Obermenge von C (anders als C++), also ist alles, was in C erlaubt ist (modulo gestohlene Identifikatoren) in Objective-C legal. – ephemient

20

Sie können eine Variable nicht am Anfang einer case-Anweisung deklarieren. Machen Sie einen Testfall, der nur daraus besteht, und Sie erhalten den gleichen Fehler.

Es hat nichts damit zu tun, dass Variablen in der Mitte eines Blocks deklariert werden - selbst wenn man einen Standard anwendet, der es erlaubt, wird GCC keine Deklaration zu Beginn einer Case-Anweisung akzeptieren. Es sieht so aus, als ob GCC das Falllabel als Teil der Linie betrachtet und daher dort keine Deklaration erlaubt.

Eine einfache Problemumgehung ist nur ein Semikolon am Anfang des Falls, so dass die Deklaration nicht am Anfang steht.

+1

False. 'switch (0) {int i; } 'Kompiliert auch in C89 perfekt. – ephemient

+0

Nicht falsch. Ich habe dein Beispiel von Aragorns Beitrag über GCC geführt und den gleichen Fehler bekommen. – Chuck

+0

Ich behaupte, dass "kann eine Variable in einer case-Anweisung nicht deklarieren" ist falsch. Versuchen Sie, GCC das winzige Beispiel in meinem vorherigen Kommentar zu geben. – ephemient

4

In C können Sie nur Variablen am Anfang eines Blocks vor allen Nicht-Deklarationsanweisungen deklarieren.

{ 
    /* you can declare variables here */ 

    /* block statements */ 

    /* You can't declare variables here */ 
} 

In C++ können Sie Variablen überall dort deklarieren, wo Sie sie brauchen.

+0

'switch (1) {Fall 0: int i = 1; Unterbrechung; Standard:/* wtf ist ich? * /; } 'Auch wenn Sie Variablen überall deklarieren können, ist innerhalb eines' switch' * gefährlich *. – ephemient

+0

mit Visual Studio 2008 eine c-Datei kompilieren. ist -> Fehler C2143: Syntaxfehler: fehlt ';' vor 'typ' =) – Aragorn

+0

Das Überspringen von Initialisierungen in C++ ist noch gefährlicher als in C, und MSVC ist eher ein C++ - Compiler als ein C-Compiler. Ich bin nicht überrascht, dass es diesen Müll nicht mag. – ephemient

0

Wie die Warnung lösen:

1.Insert ein ; in der ersten Zeile Ihres Falles Block

2.Put Codes in geschweiften Klammern

1

Sie können eine Variable innerhalb einer switch-Anweisung erstellen Sie müssen es jedoch innerhalb eines Blocks erstellen, damit der Gültigkeitsbereich der Variablen definiert wird.

Beispiel:

switch(number){ 

    case 1: 
     { 
      // Create object here 
      // object is defined only for the scope of this block 
     } 
     break; 
    case 2: 
     { 
      // etc. 
     } 
     break; 
    default: 
     break; 

} 
+0

Dies ist eine neue Antwort auf eine sehr alte Frage mit einer akzeptierten Antwort. Was sagt Ihre Antwort, dass die anderen nicht? – JAL

+0

Dies sollte eine Alternative zu der in der angenommenen Antwort dargelegten ersten Switch-Anweisung sein. Zum Zeitpunkt der Veröffentlichung hatte ich die Klammer nicht in Verbindung mit der case-Anweisung in der 2. switch-Anweisung gefunden. – egarlock

Verwandte Themen