2011-11-16 11 views
6

Date un'occhiata a questo codice:Empty "release" ASSERT programma di arresto anomalo delle macro?

#include <cassert> 

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

il programma verrà eseguito solo se ho DEBUG definito, altrimenti si bloccherà e terminare senza risultati. Sto usando MinGW in Eclipse Indigo CDT. Il consiglio è apprezzato!

risposta

7

Sei quasi certamente affermazioni abusanti. Un'espressione di asserzione non deve mai avere effetti collaterali.

Quando si dice, assert(initialize_critical_space_technology());, e quindi si omette questa intera riga nella versione di rilascio, è possibile immaginare da soli cosa accadrà.

L'unico modo sicuro e sano per utilizzare le asserzioni è in valori:

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

Alcune persone presentano una macro VERIFY per qualcosa che viene sempre eseguito il codice:

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

È difficile dirlo senza guardare il codice effettivo che causa il problema. La mia ipotesi: si sta valutando un'espressione con effetti collaterali all'interno di un ASSERT(). Ad esempio, ASSERT(++i < someotherthing) in un ciclo. È possibile confermare modificando temporaneamente la definizione della macro su solo expr su build NDEBUG. Dopo aver verificato che questa sia la causa, vai a ciascuna chiamata ASSERT che stai emettendo per assicurarti che le espressioni siano prive di effetti collaterali.

+0

Questo è probabilmente il secondo più motivo comune (dopo le ottimizzazioni) per le differenze tra le build di debug e release. –

+0

Grazie per aver risposto, solo una domanda. Sarebbe una buona pratica semplicemente '#define ASSERT (expr) (expr)' (come quello che Kerrek SB aveva menzionato) per i non-debug, e non preoccuparti solo degli effetti collaterali da lì in poi? Ho la sensazione che questo renderebbe il mio codice più leggibile. – AutoBotAM

+0

@AutoBotAM: Se si chiama 'ASSERT' 'VERIFY' invece, quindi sicuro, andare avanti. Ma non ridefinire 'ASSERT', le persone lo sanno e si aspettano che non valuti l'espressione sulle build di' NDEBUG'. –

Problemi correlati