7

Normalerweise, wenn ich ein Element aus einem Satz zu löschen, möchte ich behaupten, dass es tatsächlich gelöscht wurde: dhassert Rückgabewert, sondern laufen in beide Richtungen

assert(s.erase(e)); 

aber dann ist das Element nicht erhalten gelöscht, wenn NDEBUG gesetzt ist. Aber wenn ich schreibe

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

der Compiler beschwert sich, dass ‚entfernt‘ wird nicht verwendet, wenn NDEBUG eingestellt ist.

Wie kann ich das richtig machen?


ich am Ende nur ein Dienstprogramm Methode zu erstellen:

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

jetzt kann ich sagen

run_and_assert(s.erase(e)); 

Gibt es irgendwelche Nachteile zu diesem? Es scheint einfacher zu sein als luiscubals Lösung

+0

die Compiler? –

+0

Ich benutze g ++. Aber das sollte ein guter Compiler machen, oder? – dspyz

+3

Viele Compiler bieten eine Funktion 'verify()'/Makro, die das tut, was Sie wollen. –

Antwort

0

Ich schrieb meine eigene wie Vorschlag des luiscubal außer statt hässlich ID # define machte ich eine kurze Inline-Methode:

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

... die sich immer noch über 'unbenutzten Parameter 'x''beim Kompilieren mit' NDEBUG' beschwert und somit das Problem löst, wie? – DevSolar

8

Das erste Beispiel ist falsch, weil der assert-Ausdruck entfernt wird, wenn NDEBUG definiert ist, so dass s.erase(e) überhaupt nicht aufgerufen wird.

Das Argument von assert sollte nie Nebenwirkungen haben.

Der zweite Ansatz ist besser, obwohl die Warnung in der Tat ärgerlich sein könnte, aber there are ways to silence the warning.

Alternativ können Sie Ihre eigene assert-Anweisung erstellen, die den Code immer ausführt.

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