Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 26 Febrero 2019, 00:58 am



Título: Error C2360: la inicialización de edad se omite por la etiqueta case
Publicado por: digimikeh en 26 Febrero 2019, 00:58 am
Que tal..

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

Código
  1.  
  2. void FuncionA(int indice){
  3.  
  4.     switch (indice){
  5.  
  6.          case 0:
  7.               int edad = 0;        //Error C2360
  8.               //hacer otra cosa...
  9.  
  10.          case 1:
  11.               //hacer otras cosas...
  12.  
  13.     }
  14.  
  15. }
  16.  


Código
  1.  
  2. void FuncionA(int indice){
  3.  
  4.     switch (indice){
  5.  
  6.          case 0:
  7.               int edad;        
  8.               edad = 0;       //Esto no da error
  9.  
  10.          case 1:
  11.               //hacer otras cosas...
  12.  
  13.     }
  14.  
  15. }
  16.  


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



Título: Re: Error C2360: la inicialización de edad se omite por la etiqueta case
Publicado por: K-YreX en 26 Febrero 2019, 01:44 am
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
  1. switch(indice){
  2.    case 0:
  3.    {
  4.        int edad = 0;
  5.        // ya funciona
  6.        break; // no olvidar el break
  7.    }
  8.    case 1:
  9.        // lo que sea
  10.        break;
  11.    default:
  12.        // lo que sea
  13.        break; // opcional ya que es el ultimo
  14. }


Título: Re: Error C2360: la inicialización de edad se omite por la etiqueta case
Publicado por: digimikeh en 26 Febrero 2019, 13:39 pm
entiendo me suena aun un poco extraño pero ya veo como funciona...

Gracias.


Título: Re: Error C2360: la inicialización de edad se omite por la etiqueta case
Publicado por: CalgaryCorpus en 26 Febrero 2019, 15:51 pm
En C++ esta permitido saltar sobre definiciones.

Código
  1. {
  2.   // algunas instrucciones antes ...
  3.  
  4.   goto etiqueta;  // salto incondicional a donde este' la etiqueta
  5.  
  6.   int x;    // permitido saltarse esto
  7.  
  8.   // mas instrucciones ...
  9.  
  10. etiqueta:
  11.  
  12.   x = 1;  // pero a pesar del salto la variable x existe aqui, con valor inicial desconocido.
  13. }

Pero esta prohibido saltar las declaraciones con inicializaciones.


Ejemplo:

Código
  1. {
  2.   // algunas instrucciones antes ...
  3.  
  4.   goto etiqueta;  // salto incondicional
  5.  
  6.   int x = 3;    // no esta permitido saltarse esto
  7.  
  8.    // mas instrucciones ...
  9.  
  10. etiqueta:
  11.     // no se puede saltar aqui
  12. }


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.