2011-11-16 4 views
6

Tome un vistazo a este código:vacío "liberar" ASSERT macro bloquea el programa?

#include <cassert> 

#ifdef DEBUG 
#define ASSERT(expr) assert(expr) 
#else 
#define ASSERT(expr) 
#endif /* DEBUG */ 

el programa se ejecutará sólo si tengo DEBUG definido, de lo contrario se bloqueará y terminar sin resultados. Estoy usando MinGW en Eclipse Indigo CDT. ¡El consejo es apreciado!

Respuesta

7

Es casi seguro que abusando de las afirmaciones. Una expresión de aserción nunca debe tener efectos secundarios.

Cuando dices, assert(initialize_critical_space_technology());, y luego omites toda esta línea en la compilación de lanzamiento, puedes imaginar por ti mismo lo que sucederá.

La única manera sana y segura de usar afirmaciones es en valores:

const bool space_init = initialize_critical_space_technology(); 
assert(space_init); 

Algunas personas introducen una macro VERIFY por algo que siempre se ejecuta el código:

#define VERIFY(x) (x)   // release 
#define VERIFY(x) (assert(x)) // debug 
8

Es difícil de decir sin mirar el código real que está causando el problema. Mi suposición: estás evaluando una expresión con efectos secundarios dentro de un ASSERT(). Por ejemplo, ASSERT(++i < someotherthing) dentro de un bucle. Puede confirmar modificando temporalmente la definición de macro a solo expr en NDEBUG compilaciones. Después de confirmar que esta es la causa, vaya a cada una de las llamadas al ASSERT que está emitiendo para asegurarse de que las expresiones sean libres de efectos colaterales.

+0

Este es probablemente el segundo más razón común (después de las optimizaciones) para las diferencias entre las compilaciones de depuración y lanzamiento. –

+0

Gracias por responder, solo una pregunta. ¿Sería una buena práctica simplemente '#definir ASSERT (expr) (expr)' (como lo que Kerrek SB había mencionado) para los no-depuradores, y simplemente no preocuparse por los efectos secundarios de allí en adelante? Tengo la sensación de que esto haría que mi código sea más legible. – AutoBotAM

+0

@AutoBotAM: Si llamas a 'ASSERT'' VERIFY' en su lugar, entonces seguro, adelante. Pero no redefina 'ASSERT', las personas lo saben y esperan que no evalúe la expresión en las compilaciones' NDEBUG'. –

Cuestiones relacionadas