2012-11-21 10 views
15

Kommend von MFC, behandelte ich qDebug() ähnlich wie TRACE(), vorausgesetzt, dass es von Release-Builds vom Präprozessor entfernt wird (in MFC ist es mit #define TRACE 1 ? (void*) 0 : AfxTrace getan).Warum funktioniert qDebug in Release-Builds?

Zu meiner Überraschung wird jedoch qDebug() in Release-Builds ausgeführt. Wie ändere ich das? Und warum ist das so, was waren die Gründe für die Entwickler von Qt hinter dieser Entscheidung?

+0

nützliche Links: http://qt-project.org/forums/viewthread/25512 und http://supportforums.blackberry.com/t5/Native-Development/Dealing-with-qDebug-in-Release-Candidate/ td-p/2078713 – x29a

Antwort

22

qDebug ist auch vorprozessorgesteuert, aber es hat sein eigenes spezielles Makro, QT_NO_DEBUG_OUTPUT. Wenn Sie das zu Ihren Builddefinitionen für Release hinzufügen, wird es entfernt.

+0

Warum ist es nicht standardmäßig eingestellt? Es muss einen Grund geben, warum sie sich dafür entschieden haben. – sashoalm

+0

@ashoalm Meine Vermutung wäre, dass [die Leute nicht immer vorsichtig sind, stdin von stdout zu unterscheiden] (http://stackoverflow.com/a/3886128/1858225) (siehe die Kommentare zu dieser Antwort, sowie meine Antwort unten) (Die ursprüngliche Antwort bestand nur aus dem ersten Codeblock), und es wäre eine schlechte Übung, wenn sich Debug-Builds wesentlich anders als Release-Builds verhalten würden. –

+0

@KyleStrand Sie meinen 'stdout' und' stderr', richtig? – Angew

16

QDebug ist "Ausgabestrom für Debuginformationen". Es hat ein Standardverhalten, das je nach Nachrichtentyp auf stdout/stderr druckt. Sie können das Verhalten von qDebug() einfach anpassen, indem Sie einen eigenen Message-Handler installieren. Zum Beispiel können Sie zur Laufzeit testen (nicht Kompilierzeit), wenn Sie Debugs drucken möchten. Werfen Sie einen Blick auf dieses Codebeispiel:

#include <QDebug> 

void noMessageOutput(QtMsgType type, const char *msg) 
{ 
    Q_UNUSED(type); 
    Q_UNUSED(msg); 
} 

int main(int argc, char * argv[]) 
{ 
    QApplication app(argc, argv); 

    if (! app.arguments().contains(QLatin1String("--with-debug")) { 
     qInstallMsgHandler(noMessageOutput); 
    } 
} 

Es wird verstecken ganze qDebug ausgegeben, wenn kein Parameter zur Laufzeit angegeben ist. Sie erhalten mehr Kontrolle als nur "show debuggen/nicht zeigen debuggen"

Auch Sie können QDebug vollständig deaktivieren mit QT_NO_DEBUG_OUTPUT definieren, wenn Sie über Performance mit qDebug in Code betroffen sind betroffen sind.

0

Verwenden Sie diese Nachrichten im Release-Modus zu unterdrücken, sondern sie im Debug-Modus erlauben:

CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 

Wenn Sie nur DEFINES += QT_NO_DEBUG_OUTPUT ohne CONFIG(...) Teil verwenden Sie sie in beiden Modi deaktivieren werden, die in der Regel nicht erwünscht ist.

Verwandte Themen