7

In genere, quando mi cancellerò un elemento da un insieme, voglio affermare che in realtà è stato cancellato: cioèassert ritorno valore, ma in entrambi i casi eseguire

assert(s.erase(e)); 

ma poi l'elemento non ottiene cancellato quando viene impostato NDEBUG. Ma se scrivo

bool removed = s.erase(e); 
assert(removed); 

il compilatore si lamenta che "rimosso" non è utilizzato quando viene impostato NDEBUG.

Come posso fare questo giusto?


ho finito solo la creazione di un metodo di utilità:

inline void run_and_assert(bool b) { 
    assert(b); 
} 

Ora posso dire

run_and_assert(s.erase(e)); 

Ci sono degli svantaggi a questo? Mi sembra più semplice della soluzione di Luiscubal

+0

quale compilatore? –

+0

Sto usando g ++. Ma è quello che dovrebbe fare un buon compilatore, giusto? – dspyz

+3

Molti compilatori forniscono una funzione/macro 'verify()' che fa ciò che volete. –

risposta

0

ho scritto il mio, come il suggerimento di luiscubal tranne che invece di brutto # define di ho fatto un breve metodo inline:

inline void assert_always_execute(bool x) { 
    assert(x); 
} 
+0

... che si lamenta ancora del parametro inutilizzato 'x'' quando compilato con 'NDEBUG', e quindi risolve il problema, come? – DevSolar

8

Il primo esempio è errato perché l'espressione assert verrà rimossa quando NDEBUG è definito, quindi s.erase(e) non verrà chiamato affatto.

L'argomento di assert non dovrebbe MAI avere effetti collaterali.

Il secondo approccio è migliore, sebbene l'avviso potrebbe effettivamente essere fastidioso, ma there are ways to silence the warning.

In alternativa si potrebbe venire con la propria affermazione che esegue sempre il codice.

#ifdef NDEBUG 
#define assert_always_execute(x) (x) 
#else 
#define assert_always_execute(x) assert(x) 
#endif