2011-03-02 17 views
6

estoy consiguiendo un error de compilación en este bloque de código:Expresión esperada antes ... En sentencia switch

switch(event) { 
    case kCFStreamEventHasBytesAvailable: 
     UInt8 buf[BUFSIZE]; 
     CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE); 
     if (bytesRead > 0) { 
      handleBytes(buf, bytesRead); 
     } 
     break; 
    case kCFStreamEventErrorOccurred: 
     NSLog(@"A Read Stream Error Has Occurred!"); 
    case kCFStreamEventEndEncountered: 
     NSLog(@"A Read Stream Event End!"); 
    default: 
     break; 
} 

La línea UInt8 buf[BUFSIZE]; está causando el compilador para quejarse "expresión esperada antes de uint8" ¿Por qué?

Gracias!

+2

Es descrito [aquí] (http://stackoverflow.com/questions/92396/ por qué-cant-variables-be-declared-in-a-switch-statement) en detalle. –

+1

Esto se ha preguntado muchas, muchas veces antes: http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement http://stackoverflow.com/questions/ 1231198/declarando-variables-dentro-a-cambio-declaración http://stackoverflow.com/questions/1115304/can-i-declare-variables-inside-an-objective-c-switch-statement http: // stackoverflow. com/questions/1180550/weird-switch-error-in-obj-c http://stackoverflow.com/questions/3757445/switch-case-declaration-with-initialization-declaration-and-then-assignment –

Respuesta

16

Las instrucciones de cambio no introducen nuevos ámbitos. Además, de acuerdo con la especificación de lenguaje C, una declaración regular debe seguir una declaración de caso: no se permite una declaración de variable. Podría poner ; antes de su declaración de variable y el compilador lo aceptaría, pero la variable que definió estaría dentro del alcance del elemento primario del conmutador, lo que significa que no puede volver a declarar la variable dentro de otra instrucción de caso.

Normalmente, cuando uno define las variables dentro de los estados de casos, se introduce un nuevo ámbito de aplicación para la declaración de caso, como en

switch(event) { 
    case kCFStreamEventHasBytesAvailable: { 
     // do stuff here 
     break; 
    } 
    case ... 
} 
+0

Explicación impresionante. ¡Gracias! – Nick

Cuestiones relacionadas