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?



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.


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:
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.