Seite 1 von 1

connect standardmäßig über Q_ASSERT überprüfen

Verfasst: 2. Mai 2009 14:56
von cooky1976
Hallo,

kurze Frage ... macht es Sinn, bei jedem connect den Rückgabewert mit einem Q_ASSERT zu überprüfen?
Also so ....

Code: Alles auswählen

bool test = false;
test = connect(...);
Q_ASSERT(test);
...

Danke für die Meinungen

Alexander

Verfasst: 2. Mai 2009 20:22
von upsala
Man hat doch sowieso die Debugging-Ausgabe auf der Konsole, wieso brauche ich da noch ein QAssert?

Verfasst: 2. Mai 2009 21:44
von cooky1976
Ist immer die Frage, wieviel bei einem auf der Konsole ausgegeben wird. Der QAssert bricht ja auch das Programm ab, mit qFatal, so dass man direkt drauf gestossen wird .... meine externen Libs geben in der Minute fast 100 Zeilen aus, so dass man das schon mal übersehen kann.
Ich persönlich finde bei großen Programmen die Idee nicht so schlecht.

Verfasst: 3. Mai 2009 01:49
von FaS
Manchmal hat man auch keine Konsole.
Und der Umweg über eine temporäre Variable ist etwas viel Tipparbeit.
Ich benutze immer die Standardfunktion assert(), die gibt (zumindest unter Windows) auch eine Fehlermeldung aus. Da der Ausdruck innerhalb assert() nicht ausgeführt wird wenn man assertions deaktiviert, schummle ich etwas:
Ich packe um jedes connect ein "passert()", was wenn assertions aktiviert sind dasselbe macht wie assert, andernfalls den Befehl trotzdem normal ausführt (preserved assertion, daher das p) - gibts assert eigentlich unter Linux? Da war irgendwas... Das funzt jedenfalls unter Windows:

Code: Alles auswählen

//#define NDEBUG // NDEBUG deaktiviert assert's
#include <cassert>

// preserved assertion (wenn NDEBUG defined ist wird der Ausdruck trotzdem ausgeführt)
inline void passert( bool expression_ )
{
}
#ifndef NDEBUG
  #define passert assert
#endif
Weiß aber nich wieso das mit der Inline-Funktion gut geht, müsste der Compiler das nicht wegoptimieren? Inline heißt dich direkt ersetzen (natürlich ist das nur ein Vorschlag, aber da nichts im Rumpf steht bietet sich das wohl an), und dann würde doch auch expression_ nicht ausgewertet werden? Oder ist das so beabsichtigt, für den Fall wie wir ihn gerade haben (bzw. wenn man ein Funktionsaufruf hinschreibt erwartet man, dass Funktionen in Parametern ausgeführt werden (sofern sie nicht hinter einem "false &&" stehen o.ä.)), und alles ist toll?