2010-11-01 25 views
2

je reçois une erreur de compilation lors de l'utilisation d'un objet Objective-C dans une instruction switch:erreur du compilateur Odd lors de l'utilisation des objets Obj-C dans une instruction switch

switch (myConstant) 
{ 
    case 0: 
     UIViewController *myController = [[[UIViewController alloc] init] autorelease]; 
     [self.navigationController pushViewController:myViewController animated:YES]; 
     break; 
    case 1: 
     // stuff 
     break; 
    default: 
     break; 
} 

Les états d'erreur:

Expected expression before 'UIViewController'
'myViewController' undeclared (first use in this function)

Je comprends que la deuxième erreur est un résultat direct de la première erreur, mais ce que je ne comprends pas est pourquoi je reçois l'erreur 'expression attendue' en premier lieu ...

Si je mets un ; à la fin de la ligne case 0:, alors il va compiler, mais je ne devrais pas avoir à faire cela, non?

Cela aussi ne pas compiler, avec la même erreur:

switch (0) 
{ 
    case 0: 
     int a = 0; 
     break; 
    default: 
     break; 
} 

Cependant, si je déclare le int a; extérieur du bloc de commutation, puis a = 0; compile très bien. J'ai pensé que je comprenais les instructions de commutation - clairement je ne sais pas. Quelqu'un pourrait-il expliquer?

+0

Vous devriez acheter un livre sur le langage C. Un cas à l'intérieur d'un commutateur doit être suivi d'une déclaration. Vous l'avez suivi par une déclaration, ce qui n'est pas une déclaration. UNE ";" seul est une déclaration vide. Il est préférable de toujours utiliser une instruction composée {...} sauf pour les cas les plus simples. – gnasher729

+0

@ gnasher729 merci de me le faire savoir 4 ans plus tard;) – Jasarien

Répondre

7

Il suffit d'ajouter {} dans le cas si vous déclarez une nouvelle variable. La partie de cas d'une instruction switch n'est pas une portée correcte pour déclarer des variables en C.

case 0: 
    { 
     int a = 0; 
     break; 
    } 
... 
+0

Oh bien sûr ... On dirait que j'avais un gros pet de cerveau ... Merci! – Jasarien

+0

Je prévoyais d'accepter - mais il semble y avoir une période de 10 minutes avant d'être autorisé à accepter des réponses à de nouvelles questions. J'ai été distrait - désolé. – Jasarien