utilizar uso switch sentencia resueltos lenguaje estructura else ejemplos ejemplo control como c++ scope switch-statement variable-declaration

uso - c++ Declarar una variable dentro de una instrucción switch



switch en c# (4)

El orden del código binario de la instrucción switch puede ser diferente del código orignal porque el compilador optimizará el código en un árbol de búsqueda binaria. Por lo tanto, las variables de ámbito cruzado no están permitidas.

Tengo una instrucción switch en mi código C ++, y quiero declarar y usar una variable dentro de un case de esa declaración. La variable solo se usará dentro del alcance de ese case particular.

switch(mode) { case abc: ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; case xyz: ... commonData = Manager->getDataByIndex(this->Data.particularData); break; default: ... break; }

Intenté simplemente declarar, inicializar y usar la variable ( int someInt ) solo dentro de ese case , pero esto me dio algunos errores de compilación ... Habiendo encontrado esta pregunta en SO: ¿Por qué no se pueden declarar las variables en una instrucción switch? , Traté de hacer lo que sugería la respuesta, y agregué {} al case en cuestión, por lo que mi switch ahora se ve así:

switch(mode) { case abc: { ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; } case xyz: ... commonData = manager->getDataByIndex(this->Data.particularData); break; default: ... break; }

Pero ahora obtengo errores de compilación que dicen: "identificador no declarado" en una variable ( commonData ) que se utiliza en el caso xyz del switch .

Después de echar un vistazo a esto, parece que esta variable se declara dentro del caso abc del switch ... Así que obviamente, como he agregado {} a abc , al tratar de usarlo fuera de abc , ahora estoy tratando de usarlo fuera del alcance de su declaración.

Entonces, ¿por qué es que no puedo declarar / usar someInt de la misma forma que commonData ha sido declarado / usado sin la necesidad de {} en el case en que se declara?


La razón por la cual algunas declaraciones de variables no están permitidas en una instrucción switch es: es ilegal que el flujo de control basado en switch salte sobre una inicialización variable.

En su caso, supongo que el tipo de commonData tiene una inicialización trivial (sin constructor y sin miembros no triviales), por lo que declarar que está perfectamente bien, como sería declarar solo int someInt; . Sin embargo, int someInt = 1; no está permitido, ya que la inicialización se omitirá siempre que el mode no sea abc .

No veo exactamente qué obtendría al declarar commonData solo una vez, salvo por guardar algunas mecanografías a costa de oscurecer el código ("¿De dónde vino commonData ?" Al leer un bloque de case ), que nunca es bueno. comercio. Así que simplemente usaría {} dentro de cada "bloque" de caso y declararía commonData en cada uno que lo necesitara. O declara commonData arriba del interruptor.

Pero si realmente desea que todos los case compartan el mismo commonData que sea local al bloque de switch , puede ajustar los ámbitos. Algo como esto:

switch(mode) { SomeType commonData; case abc: { ... commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; } case xyz: ... commonData = manager->getDataByIndex(this->Data.particularData); break; default: ... break; }

o esto:

switch(mode) { case abc: SomeType commonData; ... commonData = manager->getDataByIndex(this->Data.particularData); { int someInt = 1; ... break; } case xyz: ... commonData = manager->getDataByIndex(this->Data.particularData); break; default: ... break; }

Pero por favor, piensen en el próximo mantenedor y no jueguen esos trucos.

La respuesta anterior supone struct commonData; es en realidad un "error tipográfico" en tu código: literalmente, reenvía-declara un tipo, y no declara una variable. Pero eso no concuerda ni con el uso en el resto de tu código, ni con el texto de tu pregunta, así que me tomé la libertad de arreglar esto.


Usa corchetes. Ejemplo:

switch (int number) { case 3: { int n = 5; n = n*4; // random } break; case 4: { int a = 4; // n is out of scope } break; };


{ .. } crea un ámbito local, por lo que su declaración de variable no será visible en el otro.

Agregue una declaración a cada case con alcance local, o, si desea usar la variable fuera de la instrucción de cambio, la declare antes del switch .