2010-11-25 17 views
7

Bueno, esto no es en realidad una cuestión ..Declaración de variables dentro del interruptor de C/caja

solo de vez en cuando he descubierto que hay una interesante forma de declarar variables locales dentro de un bloque switch/case. En lugar de utilizar los apoyos dentro de cada bloque caso, se puede escribir:

switch (action) { 
    int res; 
    int value; 
case ACTION_OPEN: 
    res = open(...); 
    ... 
    break; 
case ... 
} 

lo tanto, me pregunto qué compiladores de C/C++, además de apoyo gcc esta construcción? Parece una caída común. ¡Cualquier comentario sobre esta construcción es bienvenido!

+0

+1, solo para averiguar si esto es legal C++ o un accidente del compilador. Podría ser útil si está permitido. –

+0

Una manera más fácil es dejar de usar compiladores de C que están obsoletos por más de 11 años. –

+0

Aún así, a excepción de la caída ocasional, todavía prefiero los tirantes dentro de cada bloque de caja para un alcance más local. Es una cuestión de gusto. – stefaanv

Respuesta

1

Cualquier compilador C o C++ conforme a los estándares lo permitirá. Incluso un compilador de C anticuado (pre-ISO C99) lo permitirá, pero solo porque las declaraciones de las variables están al comienzo de una instrucción de bloque/compuesto (denotada por {}).

Tenga en cuenta que lo que sigue una switch es casi una declaración normal, excepto por la posibilidad de que las etiquetas de caso:

int main(int argc, char* argv[]) 
{ 
    switch (argc) 
     default: 
     puts("Hello, world!"); 

    return 0; 
} 

Así que en ANSI C89, son los apoyos que hacen la magia aquí.

3

El cuerpo del interruptor es simplemente una declaración normal (en su caso una declaración compuesta, que se parece a { ... }) que puede contener cualquier basura. Incluyendo etiquetas de casos.

Esta filosofía de conmutación es abusada por Duffs device.

Muchas personas no se dan cuenta de que incluso algo como switch(0) ; es una declaración válida (en lugar de tener una declaración compuesta, tiene una declaración nula como cuerpo), aunque es bastante inútil.

+0

Esto no tiene nada que ver con las declaraciones de variables. Duff no declaró variables dentro de su declaración 'switch', ya que los compiladores de C de su día habrían requerido bloques adicionales (que probablemente se habrían traducido a instrucciones push/pop). –

+3

@larsmans El dispositivo de Duff no tiene nada que ver con las declaraciones de variables, pero tiene todo que ver con abusar de la estructura de conmutación empleada por C y C++. En particular, las etiquetas de casos no son nada realmente "especiales", sino solo etiquetas de salto. Una vez que esto se conoce, no es sorprendente que pueda colocar declaraciones de declaración antes de las etiquetas de casos en un cuerpo de interruptor. –

-1

Creo que C99 permite declarar variables (casi) donde quiera dentro de bloques, por lo que ese comportamiento debe considerarse legal ... y no veo ningún riesgo real, ya que es solo una declaración.

0

Hablando estrictamente, el caso que presente con int está permitido en los tres idiomas, pero por diferentes motivos.

C permite saltar a través de la definición de cualquier variable local (aritmética, struct, union, matriz ...) en todos los casos (para C89) y en todos los casos excepto uno (para C99). La excepción para C99 son las matrices de longitud variable.

C++ permite esto solo para los tipos de datos que no tienen un constructor o destructor, a menudo denominado POD.

Así que si usted tiene un tipo T en lugar de int en su ejemplo en este C89 es siempre válida, y en C99 y C++ que depende del tipo T si es o no es correcto.

En cualquier caso, todo esto conduce fácilmente a variables no inicializadas, así que mejor no lo hagas si puedes evitarlo.

Cuestiones relacionadas