c++ - una - lanzamiento de moneda en visual basic
Cómo poner asertar en versiones de lanzamiento en C/C++ (7)
Solo necesito ejecutar la compilación y debo hacer valer ciertas condiciones en la compilación de la versión para ver si el problema está solucionado. ¿Cómo lo hago?
¿Por qué no solo definir su propia afirmación?
#define assert(x) MessageBox(...);
Anule la definición de la macro NDEBUG: puede hacer esto localmente en torno a las afirmaciones que desea que permanezcan en la compilación:
#undef NDEBUG
#include <assert.h> // reinclude the header to update the definition of assert()
o haga lo que sea necesario para que su proceso de compilación no defina la macro NDEBUG en primer lugar.
Cuando se utiliza Visual Studio, puede anular la definición de la definición del precompilador NDEBUG a las afirmaciones activas en la compilación de la versión.
Por ejemplo, puede establecer $ (undefesTheNDEBUG) en su configuración de Projekt para la opción / U y luego definir la variable de entorno undefesTheNDEBUG a NDEBUG (SET undefesTheNDEBUG = NDEBUG) o pasarla junto con msbuild (/ p: undefesTheNDEBUG = NDEBUG)
El comportamiento predeterminado de ASSERT es abortar el programa en la configuración de depuración, pero esto generalmente se convierte en un no-op en una configuración de lanzamiento. Creo que lo hace comprobando la existencia de la macro NDEBUG del preprocesador. No estoy en el trabajo en este momento, así que no puedo verificar esto.
Creo que la forma más fácil de solucionar esto es modificar la configuración de la depuración para que todas las optimizaciones alcancen el mismo nivel que la versión (O2 de la memoria) y luego reconstruir el software. Esto le dará el rendimiento y la velocidad equivalentes de una compilación de la versión, pero seguirá definiendo la macro del preprocesador NDEBUG, lo que significa que todos los ASSERT fallidos seguirán haciendo que el programa se cancele. Solo recuerde volver a cambiar el nivel de optimización más tarde, de lo contrario tendrá problemas para depurar en la configuración de depuración.
Sin embargo, en general, los ASSERT solo deben usarse para programar condiciones previas y nunca para manejar fallas en el software de envío. Desea fallar rápidamente durante el desarrollo, pero con gracia delante de un usuario.
En realidad, me gustaría enviar la versión de depuración si puedes vivir con ella. Si no necesita el rendimiento de la versión de lanzamiento, use la depuración. Tiende a tener menos errores (esto es una simplificación excesiva y si su programa está libre de errores, simplemente cambiar a la versión no cambia esto, pero debido a cosas que el compilador hace en el modo de depuración, los errores pueden no ocurrir y / o tener consecuencias menos graves).
Quizás también sea posible optimizar solo las partes críticas de tiempo de su programa.
También puede simplificar la depuración.
Me gusta definirlo para lanzar algún tipo de assert_exception derivado de un std :: runtime_error. Entonces cógelo en algún lugar y haz algo útil.
Simplemente llame directamente a la parte de la definición de macro de afirmación que está activa en el modo de liberación.
Puede encontrar definiciones muy útiles para aserciones en C ++ en este gran artículo de Miro Samek ( PDF ). Luego puedes modificarlos un poco para satisfacer tus necesidades. Por ejemplo, puede crear otra macro, release_assert
, que haga lo mismo que aseverar pero sin importar si está en modo de liberación o de depuración.