Error C2360: la inicialización de edad se omite por la etiqueta case

Iniciado por digimikeh, 26 Febrero 2019, 00:58 AM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

Que tal..

Este error sinceramente no le hallo lógica, imagino que debe ser un tipo de política de c++...

Código (cpp) [Seleccionar]


void FuncionA(int indice){

     switch (indice){

          case 0:
               int edad = 0;        //Error C2360
               //hacer otra cosa...

          case 1:
               //hacer otras cosas...

     }

}



Código (cpp) [Seleccionar]


void FuncionA(int indice){

     switch (indice){

          case 0:
               int edad;       
               edad = 0;       //Esto no da error

          case 1:
               //hacer otras cosas...

     }

}



Debo declarar siempre sin definir una variable cuando entro al cuerpo de un case ?

Dungeons & dragons;
dragons.Attack();

K-YreX

Esto sucede porque una variable creada en un <case> del <switch> sigue existiendo en el resto de <case>. Pero no tienen el valor inicializado y por eso si escribes la inicialización junto a la declaración, te va a dar un error.

Una forma de solucionar eso es separando la inicialización de la declaración como has visto tú. Y otra forma es usar llaves {} para crear un bloque. :-X
Código (cpp) [Seleccionar]

switch(indice){
    case 0:
    {
        int edad = 0;
        // ya funciona
        break; // no olvidar el break
    }
    case 1:
        // lo que sea
        break;
    default:
        // lo que sea
        break; // opcional ya que es el ultimo
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

digimikeh

entiendo me suena aun un poco extraño pero ya veo como funciona...

Gracias.
Dungeons & dragons;
dragons.Attack();

CalgaryCorpus

#3
En C++ esta permitido saltar sobre definiciones.

Código (cpp) [Seleccionar]
{
  // algunas instrucciones antes ...

  goto etiqueta;  // salto incondicional a donde este' la etiqueta

  int x;    // permitido saltarse esto

  // mas instrucciones ...

etiqueta:
 
  x = 1;  // pero a pesar del salto la variable x existe aqui, con valor inicial desconocido.
}


Pero esta prohibido saltar las declaraciones con inicializaciones.


Ejemplo:

Código (cpp) [Seleccionar]

{
  // algunas instrucciones antes ...

  goto etiqueta;  // salto incondicional

  int x = 3;    // no esta permitido saltarse esto

   // mas instrucciones ...

etiqueta:
    // no se puede saltar aqui
}



cada case de un switch es una etiqueta, y la variable es visible dentro de todo el switch, en el case actual y los siguientes.

Dado que la ejecucion del switch es un salto a cada etiqueta, al poner una definicion con inicializacion, se da el caso que esta prohibido, por ello el error de compilacion.

Aqui mi perfil en LinkedIn, invitame un cafe aqui