SoloCodigo

Programación General => C/C++ => Visual C++ => Mensaje iniciado por: diego.martinez en Lunes 19 de Febrero de 2007, 11:35

Título: Compilador Y Seh
Publicado por: diego.martinez en Lunes 19 de Febrero de 2007, 11:35
Buenas:

Me he creado una macro, que dependiendo de si se define un define mio, cambia la forma en la que se reciben las excepciones:

Código: Text
  1.  
  2.  
  3. #ifdef DEBUG_APP_ERROR
  4.   #define _APP_TRY __try
  5.   #define _APP_CATCH(m) __except (ExpFilter(m,GetExceptionInformation(), GetExceptionCode(),__LINE__,__FUNCTION__)){}
  6. #else
  7.   #define _APP_TRY try
  8.   #define _APP_CATCH(m) catch(...) {}
  9. #endif
  10.  

despues lo uso en un cacho de codigo:

Código: Text
  1.  
  2. #define DEBUG_APP_ERROR
  3. while (!app->IsFinished())
  4.     {    
  5.     _APP_TRY
  6.         {    
  7.         app->Init     ();
  8.         app->Main   ();
  9.         app->End   ();
  10.         }
  11.         _APP_CATCH("Bucle Principal");
  12.     }
  13.  
  14.  


Bueno, el caso es que cuando lo compilo, me dice :

Cannot use __try in functions that require object unwinding Cannot use __try in functions that require object unwinding

He buscado en Google y la causa es que no compilaba con /GX- para deshabilitar las SEH y usar try/catch de c (corregidme si me equivoco).

La cosa ahora es que con esa opcion, cuando compilo, el compilador me saca otro warning si uso el "using namespace STD".

warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc

Bueno, pues son Incompatibles uno con el otro /Gx- override /EHsc , si quito /Gx- me dice que no puede hacerlo y si lo pongo me dice que no tiene el unwind...

¿Que estoy haciendo mal?
¿Puedo ignorar el warning?
¿Me estoy liando y realmente no entendi bien?

Gracias por adelantado y disculpad el tamaño del post.
Título: Re: Compilador Y Seh
Publicado por: Danielo en Lunes 19 de Febrero de 2007, 12:09
:think:  en algunos compiladores (como el de CygWin) el iostream.h ha quedado obsoleto, y hay que utilizar iostream (sin el .h)

Código: Text
  1. #include <iostream>
  2.  

A lo mejor con eso desaparece el warning de "using namespace STD".
Título: Re: Compilador Y Seh
Publicado por: Eternal Idol en Lunes 19 de Febrero de 2007, 12:16
Si, son incompatibles, SEH esta pensado para C y no es parte del lenguaje (ni de C ni de C++) sino que es la forma de capturar excepciones en Windows, por eso te da warning cuando usas objetos.
Título: Re: Compilador Y Seh
Publicado por: diego.martinez en Lunes 19 de Febrero de 2007, 12:22
gracias por la respuesta.

lo tenia como  #include <iostream>
por que el iostream.h ni lo encuentra

asi que ningun cambio por ahi.

los warning todos aparecen en iostream.h y en ostream.h

uso Visual Studio .Net 2003 por si se os ocurre si es alguna cosa propia del compilador.
Título: Re: Compilador Y Seh
Publicado por: diego.martinez en Lunes 19 de Febrero de 2007, 12:27
vaya, justo estaba respondiendole a Danielo cuando ha respondido EternalIdol.

Entonces, es un buen lio, por que tengo parte de codigo usando try/catch de c y otra parte de SEH...

Tendria que limpiarlo todo , entonces la pregunta es...
si es una aplicacion windows es mejor usar SEH por los ExceptionHandlers o es mejor __try/__catch?.

Si en un mismo obj no se mezclan los 2 modelos (Se conmutan con el Define); puede la aplicacion convivir con modulos SEH y  otros con try de c  o  es peligroso?

gracias por las respuestas.
Título: Re: Compilador Y Seh
Publicado por: Eternal Idol en Lunes 19 de Febrero de 2007, 12:39
Cita de: "diego.martinez"
Entonces, es un buen lio, por que tengo parte de codigo usando try/catch de c y otra parte de SEH...

¿Existe alguna razon para que lo hayas hecho asi?

Cita de: "diego.martinez"
Tendria que limpiarlo todo , entonces la pregunta es...
si es una aplicacion windows es mejor usar SEH por los ExceptionHandlers o es mejor __try/__catch?.

Te recomiendo que leas MUY DETENIDAMENTE lo que comenta en la MSDN sobre esas opciones (/EH, /GX, etc).

Cita de: "diego.martinez"
Si en un mismo obj no se mezclan los 2 modelos (Se conmutan con el Define); puede la aplicacion convivir con modulos SEH y  otros con try de c  o  es peligroso?

Segun me parecio entender lo que puede pasar es que no captures todas las excepciones que se suponen ibas a capturar y que como indica el warning no se destruyan correctamente los objetos pese a capturar la excepcion. Pere me remito a la anterior respuesta  B)
Título: Re: Compilador Y Seh
Publicado por: diego.martinez en Lunes 19 de Febrero de 2007, 13:57
La razon es que no todos los modulos los he hecho yo, tendria que cambiarlos.  <_<

A mi tambien me parece que no esta capturando las excepciones internas...

Gracias por las respuestas, seguire investigando...