2010-04-30 10 views
6

Qual è il livello di avviso che si utilizza durante la compilazione dei progetti QT?Suggerimento livello avviso QT

Quando ho compilato con W4, sto ricevendo un sacco di avvertimenti come:

C4127: conditional expression is constant 

Dovrei compilare in W3, o trovare altri modi per gestire gli avvisi a W4, come ad esempio: aggiunta di un nuovo file di intestazione e utilizzo di pragma (menzionato qui C++ Coding Standards: 101 Rules, Guidelines and Best Practices).

Quali sono le tue pratiche?

Grazie.

+0

Non riesco a capire perché un'espressione condizionale costante dovrebbe essere un problema. –

+2

IMO, se è costante, semplicemente non ne hai bisogno. Spiegazione Microsoft per questo avviso: http://msdn.microsoft.com/en-us/library/6t66728h%28VS.80%29.aspx – metdos

risposta

10

Ho incontrato lo stesso identico problema si dispone di un paio di anni fa, quella di impostare il compilatore a livello di 4 avvisi per catturare il maggior numero possibile di problemi potenziali. All'epoca avevo un contratto di supporto con Qt e chiedevo loro perché il loro codice generasse così tanti avvertimenti. La loro risposta fu che non avrebbero mai garantito che il loro codice sarebbe stato compilato senza alcun preavviso. Solo che il loro codice funzionerebbe correttamente.

Dopo diversi tentativi, ho iniziato che circonda i file header Qt con pragma per disattivare gli avvertimenti come mostrato di seguito -

#pragma warning(push,3) // drop compiler to level 3 and save current level 
#include <QString> 
#include <QVariant> 
#include <QStack> 
#include <QLabel> 
#include <QtGui/QTableWidget> 
#pragma warning(pop) // restore compiler warning level 

Facendo in questo modo, si compila solamente i file di intestazione Qt al livello di allarme inferiore . O qualsiasi livello ci vuole per sbarazzarsi degli avvertimenti. Si può avere alcuni singoli avvertimenti che mostrano ancora in piedi, così si potrebbe aumentare il livello di allarme o disabilitare singoli avvisi con

#pragma warning(disable: 4700) 

Alcuni file libreria Boost hanno anche questo problema.

4

Personalmente uso solo i Makefile generati da qmake per impostazione predefinita ... sulla presunzione di potermi fidare dei ragazzi di Nokia per far sì che generino Makefile che fanno la cosa giusta per l'ambiente di costruzione corrente.

Vedo che qmake vorranno alcuni argomenti opzionali per quanto riguarda le avvertenze, però:

The level of warning information can be fine-tuned to help you find problems in your project file: 

-Wall 
qmake will report all known warnings. 
-Wnone 
No warning information will be generated by qmake. 
-Wparser 
qmake will only generate parser warnings. This will alert you to common pitfalls and potential problems in the parsing of your project files. 
-Wlogic 
qmake will warn of common pitfalls and potential problems in your project file. For example, qmake will report whether a file is placed into a list of files multiple times, or if a file cannot be found. 
+1

Se non sbaglio, queste opzioni di avviso sono valide quando si esegue qmake per generare il file make, non per quando si esegue il makefile generato. –

1

Utilizzare CONFIG += warn_on nel file .pro.

Vedere the documentation.

Opzione

warn_on 
    The compiler should output as many warnings as possible. 
    This is ignored if warn_off is specified. 

warn_off 
    The compiler should output as few warnings as possible. 
1

Se si sta combattendo con Q_ASSERT in Visual Studio, tutta quella roba avvertimento push/pop non funziona, dal momento che le macro sono "istanziati" in atto, molto indietro rispetto alle intestazioni. Quindi, vorrei suggerire a ridefinire Q_ASSERT:

#ifdef NDEBUG 
#undef Q_ASSERT 
#define Q_ASSERT(x) __noop 
#endif 
0

in base alla risposta user2846246 s', ho trovato che l'aggiunta di quanto segue nella fase iniziale nella compilazione di qualsiasi libreria utilizza Qt ha fatto il trucco (nel mio caso quella libreria utilizza un file di intestazione precompilata in Visual Studio così ho aggiunto il codice per quel file di intestazione):

#ifndef _DEBUG 
    #undef Q_ASSERT 
    #define Q_ASSERT(x) __noop 
    #undef Q_ASSERT_X 
    #define Q_ASSERT_X(cond, where, what) __noop 
#endif 

che è fantastico come Non mi piace far cadere il livello di avviso di un'intera biblioteca.

Problemi correlati