2010-04-30 17 views
6

Quel est le niveau d'avertissement que vous utilisez lors de la compilation de projets QT?Suggestion de niveau d'avertissement QT

Quand je compilé avec W4, je reçois beaucoup d'avertissements tels que:

C4127: conditional expression is constant 

Dois-je compiler à W3, ou de trouver d'autres façons de gérer les avertissements à W4, tels que: l'ajout d'une nouvelle fichier d'en-tête et en utilisant pragma (mentionné ici Normes de codage C++: 101 règles, directives et meilleures pratiques).

Quelles sont vos pratiques?

Merci.

+0

Je ne vois pas pourquoi une expression conditionnelle constante devrait poser problème. –

+2

IMO, Si c'est constant, vous n'en avez pas besoin. Microsoft explication pour cet avertissement: http://msdn.microsoft.com/en-us/library/6t66728h%28VS.80%29.aspx – metdos

Répondre

10

J'ai couru dans le même problème que vous avez, il y a quelques années, celui de la mise au compilateur de niveau 4 avertissements pour attraper autant de problèmes potentiels que possible. À l'époque, j'avais un contrat de support avec Qt et je leur ai demandé pourquoi leur code générait tant d'avertissements. Leur réponse a été qu'ils n'ont jamais pensé que leur code compilerait sans aucun avertissement. Seulement que leur code fonctionnerait correctement.

Après plusieurs tentatives, j'ai commencé autour des fichiers d'en-tête Qt avec pragma pour désactiver les avertissements comme indiqué ci-dessous -

#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 

En le faisant de cette façon, vous compilez uniquement les fichiers d'en-tête Qt au niveau d'avertissement inférieur . Ou quel que soit le niveau requis pour se débarrasser des avertissements. Vous pouvez avoir des avertissements individuels qui montrent encore, donc vous pouvez augmenter le niveau d'alerte ou désactiver les avertissements individuels avec

#pragma warning(disable: 4700) 

Certains fichiers de bibliothèque Boost ont également ce problème.

4

Personnellement, j'utilise simplement les Makefiles que qmake génère par défaut ... en supposant que je peux faire confiance aux gars de Nokia pour qu'ils génèrent des Makefiles qui font la bonne chose pour l'environnement de construction actuel.

Je ne vois que qmake prendra des arguments facultatifs concernant les avertissements, cependant:

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

Si je ne me trompe pas, ces options d'avertissement sont pour quand vous exécutez qmake pour générer le fichier make, pas pour quand vous exécutez le makefile qui est généré. –

1

Utilisez CONFIG += warn_on dans votre fichier .pro.

Voir the documentation.

Option

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

Si vous vous battez avec Q_ASSERT dans Visual Studio, ce genre de choses push/pop avertissement ne fonctionnera pas, car les macros sont "instanciées" en place, loin derrière vous les en-têtes. je vous conseille donc de redéfinir Q_ASSERT:

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

Sur la base de la réponse de user2846246, je trouve que l'ajout de ce qui suit au début de la compilation de quelle que soit la bibliothèque utilise Qt fait le tour (dans mon cas cette bibliothèque utilise un fichier d'en-tête précompilé dans Visual studio donc je vient d'ajouter le code à ce fichier d'en-tête):

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

ce qui est génial que je déteste laisser tomber le niveau d'avertissement d'une bibliothèque.