Error de compilación con: modificador, "expresión esperada antes"

79

Corte al grano, he recreado mi problema, ya que se explica por sí mismo.

esto cumple sin error:

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

esto se compila con error y solo falta el NSLog ():

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

arroja un error al compilar " Expresión esperada antes de 'NSString' "

¿Me estoy perdiendo de algo?

Ross
fuente
Recuerdo una declaración de cambio / caso con un error similar, solía desaparecer cuando agrego un comentario en algún lugar dentro del bloque de caso. Magia
Yunus Nedim Mehel

Respuestas:

164

En C normal, tendría que encerrar esto entre corchetes en ambos casos. Sospecho que esto puede solucionar su problema:

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

Consulte esta pregunta SO para obtener más información.

Otra forma de solucionar este problema es poner una declaración entre la etiqueta del caso y la primera declaración como lo hizo en su ejemplo de trabajo anterior. Vea los comentarios y la respuesta de Quinn Taylor para obtener más información.

Dan Olson
fuente
1
Interesante. No probé el enfoque de soporte.
Eimantas
Sí, esto soluciona el problema. Solo estaba ejecutando con el relleno de código de xcode que no los usa. Gracias.
Ross
Me he encontrado con este problema antes, lo resolví usando {} yo mismo, es bueno ver que era la solución correcta. +1 para ti Dan.
David Wong
20
No es necesario que utilice corchetes. Poner una declaración vacía ( ;) después de la caseetiqueta también funciona. La razón del error y la razón por la que ambas soluciones funcionan es que una etiqueta, incluida una caseetiqueta, solo puede preceder a una declaración. Las declaraciones no son declaraciones en C (C99 §6.7, §6.8, §6.8.2) y Objective-C, por lo que no puede poner una etiqueta inmediatamente antes de una declaración. Por lo tanto, las soluciones: coloque una declaración (como ;o NSLog(@"");) entre la etiqueta y la declaración, o envuelva la declaración dentro de una declaración compuesta (los corchetes) después de la etiqueta.
Peter Hosey
Gracias, esta respuesta ayuda
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:
kiran kumar
fuente