2011-10-09 12 views
9

Tengo una declaración complicada switch, y olvidé poner un break al final de uno de los case s. Esto es bastante legal, y como resultado tuve un fracaso en el próximo case.¿Cómo puedo decirle a gcc que advierta (o falle) en las declaraciones de cambio/caso sin interrupción?

¿Hay alguna forma de que gcc advierta (o incluso mejor, falle) si omito poner una declaración break?

Me doy cuenta de que hay muchos casos de uso válidos (y los uso a menudo en mi código), como se ejemplifica en this question, así que obviamente una advertencia (o falla) necesitaría una simple exención para poder decir fácilmente, "Quiero caer aquí".

¿Hay alguna manera de decirle a gcc que haga esto?

+0

Honestamente, si eso es lo que quiere, yo diría que simplemente no usan switch/case. La única ventaja del interruptor/caja que aún permanece es que es fácil pasar por donde lo desee. –

+0

Hehehe, C# lo obliga a poner la declaración de interrupción y no compilará si no lo hace – BlackBear

+0

Simplemente curioso, ¿podemos ver el código? Tal vez hay una solución aún mejor que no requiere un interruptor. – fredoverflow

Respuesta

1

Se podría construir una expresión regular para grep/Perl/emacs/etc para encontrar todos los lugares donde no hay breakcase antes.

0

La respuesta corta es no, no existe tal indicador en gcc para hacer eso. La caja del interruptor se usa para la caída más a menudo, por eso no tiene sentido tener una bandera de este tipo en gcc.

+2

Creo que tiene sentido, simplemente no es necesario activarlo de manera predeterminada. Parece que puede ser apropiado para -extra o -pedante. –

4

Esta comprobación está disponible en Cppcheck, un analizador estático gratuito para códigos C y C++. El cheque actualmente está marcado como "experimental", por lo que deberá usar el interruptor de línea de comando --experimental para encenderlo.

Esta comprobación advierte contra una cláusula caso no vacío que cae a través de la siguiente caso sin un estado de flujo de control, tales como break, continue, return, etc, menos hay un comentario con palabras tales como // fall through inmediatamente anterior a la próxima case.

Puede hacerse una idea de los tipos de construcciones que esto maneja al echar un vistazo a switchFallThroughCase test cases en el código fuente.

Cuestiones relacionadas