2012-11-21 14 views
15

Provenendo da MFC, ho trattato qDebug() molto simile a TRACE(), supponendo che sia stato rimosso dalle versioni di Release dal preprocessore (in MFC è stato eseguito utilizzando #define TRACE 1 ? (void*) 0 : AfxTrace).Perché qDebug funziona nelle versioni di Release?

Con mia sorpresa, tuttavia, qDebug() viene eseguito anche nei build di rilascio. Come posso cambiare questo? E inoltre, perché è così, qual è stato il ragionamento degli sviluppatori di Qt dietro questa decisione?

+0

link utili: http://qt-project.org/forums/viewthread/25512 e http://supportforums.blackberry.com/t5/Native-Development/Dealing-with-qDebug-in-release-candidate/ td-p/2078713 – x29a

risposta

22

qDebug è anche controllato dal preprocessore, ma ha una sua macro speciale, QT_NO_DEBUG_OUTPUT. Se lo aggiungi alla build Release, verrà rimosso.

+0

Quindi perché non è impostato di default? Ci deve essere una ragione per cui hanno deciso su questo. – sashoalm

+0

@sashoalm La mia ipotesi sarebbe che [le persone non sono sempre attente a distinguere lo stdin dallo stdout] (http://stackoverflow.com/a/3886128/1858225) (vedere i commenti su quella risposta, oltre alla mia risposta qui sotto la risposta originale consisteva solo del primo blocco di codice), e sarebbe una cattiva pratica far sì che i build di debug si comportassero in modo sostanzialmente diverso dalle build di rilascio per impostazione predefinita. –

+0

@KyleStrand Significa 'stdout' e' stderr', giusto? – Angew

16

QDebug è "flusso di output per informazioni di debug". Ha il comportamento predefinito che sta stampando su stdout/stderr a seconda del tipo di messaggio. È possibile personalizzare facilmente il comportamento di qDebug() installando il proprio gestore di messaggi. Ad esempio, è possibile eseguire il test in fase di esecuzione (non in fase di compilazione) se si desidera stampare i debug. Date un'occhiata a questo esempio di codice:

#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); 
    } 
} 

Si nasconderà intera produzione qDebug se non v'è alcun parametro specificato in fase di esecuzione. Ottieni un maggiore controllo rispetto a "mostra debug/non mostrare il debug"

Inoltre puoi disabilitare completamente QDebug con QT_NO_DEBUG_OUTPUT definire se sei preoccupato per le prestazioni perse con qDebug presente nel codice.

0

Utilizzare questo per sopprimere i messaggi in modalità di rilascio, ma li consentono in modalità debug:

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

Se si utilizza solo DEFINES += QT_NO_DEBUG_OUTPUT senza la parte CONFIG(...) loro si disabilitare in entrambe le modalità, che di solito non è desiderabile.

Problemi correlati