c ++: falta el punto y coma en la declaración de cambio antes de cerrar la llave

En interés de futuros lectores y de mi propia cordura más adelante, me gusta dejar absolutamente claro que switch declaraciones que no tienen default caso (debido a que todos los casos están cubiertos) o secuencial if-elseif-else con un else final que no debe hacer nada no debe omitirse y debe incluirse un comentario al respecto (ver ejemplo).

Sin embargo, cada vez que incluyo el default caso en el switch declaración y dejarlo vacío debo poner un punto y coma dentro de la default caso o un error del compilador: " Línea [Línea de la llave de cierre de la declaración del interruptor] `falta ';' antes de que aparezca '}'". ¡¿POR QUÉ?!

EJEMPLO: GENERA ERROR DEL COMPILADOR

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */
}

EJEMPLO: NO GENERA ERROR DEL COMPILADOR

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */;
}

preguntado el 21 de mayo de 12 a las 19:05

FYI, el caso predeterminado es opcional en C ++ ... -

Si quieres ser coherente, pon un break; después del valor predeterminado. -

2 Respuestas

Porque necesita una declaración para su default caso. Un punto y coma es una declaración vacía.

contestado el 21 de mayo de 12 a las 19:05

6.1/1 en C++03 da la gramática para una declaración etiquetada:

declaración-etiquetada:
    identificador : ambiental
    case expresión-constante : ambiental
    por defecto: ambiental

C ++ 11 es lo mismo, excepto que puede tener atributos antes de la etiqueta.

Una secuencia de tokens de longitud cero no es una ambiental en C++, por lo tanto default: por sí solo no es un declaración-etiquetada.

Dicho esto, no sé cuál fue la motivación por la cual la gramática para un declaración-etiquetada no permite default: statementopt. Si lo hiciera, habría una ambigüedad gramatical si escribiera default : case 1: break;, ya sea case 1: break; es la ambiental perteneciendo a default:, o si default: no tiene ambiental por sí mismo, pero es seguido inmediatamente por uno. Todavía no hay duda de lo que significa, pero tal vez se pensó que estropearía los analizadores de las personas.

contestado el 21 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.