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
.