2010-04-30 19 views
6

¿Cuál es el nivel de advertencia que utiliza al compilar proyectos QT?QT warning level suggestion

Cuando se compila con W4, estoy recibiendo una gran cantidad de advertencias tales como:

C4127: conditional expression is constant 

¿Debo compilar en W3, o encontrar otras maneras de manejar las advertencias de W4, tales como: la adición de un nuevo archivo de encabezado y el uso de pragma (mencionado aquí C++ Normas de codificación: 101 Reglas, directrices y mejores prácticas).

¿Cuáles son sus prácticas?

Gracias.

+0

No veo por qué una expresión condicional constante debería ser un problema. –

+2

IMO, si es constante, simplemente no lo necesita. Explicación de Microsoft para esta advertencia: http://msdn.microsoft.com/en-us/library/6t66728h%28VS.80%29.aspx – metdos

Respuesta

10

me encontré con el mismo problema que tiene un par de años atrás, la de fijar el compilador para el nivel 4 advertencias atrapar tantos problemas potenciales como sea posible. En ese momento, tenía un contrato de soporte con Qt y les pregunté por qué su código generaba tantas advertencias. Su respuesta fue que nunca se dieron cuenta de que su código se compilaría sin ninguna advertencia. Solo que su código se ejecutaría correctamente.

Después de varios intentos, empecé rodea a los archivos de cabecera de Qt con pragmas para desactivar las advertencias como se muestra a continuación -

#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 

Al hacerlo de esta manera, sólo compila los archivos de cabecera de Qt en el nivel de aviso mínimo . O el nivel que sea necesario para deshacerse de las advertencias. Es posible que tenga algunos avisos individuales que siguen apareciendo, por lo que podría elevar el nivel de alerta o desactivar las advertencias individuales con

#pragma warning(disable: 4700) 

Algunos archivos de la biblioteca Boost también tienen este problema.

4

Personalmente solo uso los Makefiles que qmake genera de forma predeterminada ... con la presunción de que puedo confiar en los chicos de Nokia para que generen Makefiles que hagan lo correcto para el entorno de compilación actual.

veo que qmake tomará algunos argumentos opcionales respecta a los avisos, sin embargo:

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 no me equivoco, estas opciones de advertencia son para cuando ejecuta qmake para generar el archivo make, no para cuando ejecuta el archivo MAKE que se genera. –

1

Use CONFIG += warn_on en su archivo .pro.

Ver the documentation.

Opción

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 estás luchando con Q_ASSERT en el estudio visual, todas esas cosas empuje de advertencia/pop no funcionará, ya que las macros se "crea una instancia" en su lugar, muy detrás de ti encabezados. así que yo sugeriría que redefinir Q_ASSERT:

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

Basado en respuesta user2846246 's, he encontrado que la adición de la siguiente desde el principio en la compilación de cualquier biblioteca utiliza Qt hizo el truco (en mi caso esa biblioteca utiliza un archivo de encabezado precompilado en Visual Studio, así que acaba de agregar el código para que el archivo de cabecera):

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

Cuál es grande como que no me gusta dejar caer el nivel de advertencia de una biblioteca entera.

Cuestiones relacionadas