2009-07-12 9 views
54

Creo que me estoy quedando ciego, porque no puedo averiguar dónde está el error de sintaxis es en este código:¿Puedo declarar variables dentro de una instrucción de cambio Objective-C?

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

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

Cuando intento compilar, estoy recibiendo un error : error de sintaxis antes del token '*' en la última línea.

Lo siento por una pregunta tan básica, pero ¿qué me estoy perdiendo?

+1

¿Qué tipo de variable es cellNumber? La instrucción de cambio es de C, por lo que usar los tipos de Objective-C puede hacer que se dispare. –

+1

C solo admite objetos de tipo integral para 'switch/case', y esperaría un mensaje de error diferente si ese fuera el problema aquí. – ephemient

+0

¿Objective-C sigue C99 (y C++) y le permite declarar variables en cualquier lugar, o solo puede hacerlo al comienzo de un bloque?Si está obligado a declararlos al inicio de un bloque, puede corregir el error de sintaxis colocando un '' {''después de' ':' 'de' 'caso 1:'' y un '' coincidente '' ''antes del final del caso. –

Respuesta

66

que no tienen un compilador adecuado Objective-C en la mano, pero siempre y cuando las construcciones C son idénticos:

switch { … } le da una alcance a nivel de bloque, no una para cada case. Declarar una variable en cualquier lugar que no sea el principio del alcance es ilegal, y dentro de un switch es especialmente peligroso porque su inicialización puede saltarse.

¿Resuelve el problema alguno de los siguientes?

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

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

wrt/'Declarar una variable en cualquier lugar que no sea el principio del alcance es ilegal'. Esto no es verdad en C99. C99 permite esto y define la semántica de lo que sucede cuando "el control pasa por encima de una declaración" y el valor de esa declaración en tales casos. – johne

+0

Olvidé indicar qué opción resolvió el problema, ¡Uy! Usé el superior para resolver el problema, no creo que haya probado la segunda sugerencia, lo cual es una lástima, ¡porque parece que estaban teniendo una gran discusión! – JoBu1324

+0

Más detalles sobre por qué funcionan en http://stackoverflow.com/questions/1231198 –

1

¿No sería válido declarar una variable dentro de un bloque de interruptores?

+0

Como mencioné en la respuesta de Chuck: 'switch (0) {int i; } 'es C89 válido, y Objective-C es un superconjunto verdadero de C (a diferencia de C++), por lo que todo lo legal en C (identificadores robados en módulo) es legal en Objective-C. – ephemient

20

No puede declarar una variable al comienzo de una declaración de caso. Haga un caso de prueba que solo consista en eso y obtendrá el mismo error.

No tiene que ver con que las variables se declaren en el medio de un bloque; incluso la adopción de un estándar que permita eso no hará que GCC acepte una declaración al comienzo de una declaración de caso. Parece que GCC ve la etiqueta del caso como parte de la línea y, por lo tanto, no permitirá una declaración allí.

Una solución simple es simplemente poner un punto y coma al comienzo de la caja para que la declaración no esté al inicio.

+1

False. 'switch (0) {int i; } 'compila perfectamente bien incluso en C89. – ephemient

+0

No es falso. Acabo de ejecutar su ejemplo de la publicación de Aragorn a través de GCC y obtuve el mismo error. – Chuck

+0

Estoy afirmando que "no se puede declarar una variable en una declaración de caso" es falso. Prueba darle a GCC el pequeño ejemplo en mi comentario anterior. – ephemient

4

En C solo se pueden declarar las variables al principio de un bloque antes de las declaraciones que no sean de declaración.

{ 
    /* you can declare variables here */ 

    /* block statements */ 

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

En C++ puede declarar las variables en cualquier lugar que las necesite.

+0

'interruptor (1) {caso 0: int i = 1; descanso; predeterminado:/* wtf es yo? * /; } 'Incluso si puede declarar variables en todas partes, dentro de un 'interruptor' es * peligroso *. – ephemient

+0

con visual studio 2008 compilando un archivo c. es -> error C2143: error de sintaxis: falta ';' antes de 'tipo' =) – Aragorn

+0

Saltarse los inicializadores en C++ es incluso más peligroso que en C, y MSVC es más un compilador de C++ que un compilador de C. No me sorprende que no le guste esta basura. – ephemient

0

¿Cómo resolver la advertencia:

1.Inserte uno ; en la primera línea de su bloque caso

códigos 2.Put dentro de llaves

1

Puede crear una variable de una sentencia switch pero deberá crearlo dentro de un bloque para que se defina el alcance de esa variable.

Ejemplo:

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

Esta es una nueva respuesta a una pregunta muy antigua con una respuesta aceptada. ¿Qué proporciona tu respuesta que los otros no? – JAL

+0

Esto se suponía que era una alternativa a la primera declaración de cambio presentada en la respuesta aceptada. En el momento de la publicación, no había notado el corchete en línea con la declaración del caso en la segunda declaración de cambio provista. – egarlock

Cuestiones relacionadas