2011-01-11 15 views
5

Duplicar posibles:
Best compiler warning level for C/C++ compilers?C++: ¿Qué parámetros de GNU G ++?

GCC tiene miles de opciones para añadir más advertencias; Esperaba que -Wall-Wextra-pedantic incluyera todos los útiles, pero justo ahora me encontré con -Woverloaded-virtual que me parece muy agradable.

¿Qué otros parámetros de G ++ usa o recomendaría?

+0

quizá de verificación de la documentación? – asveikau

+2

Duplicado de http://stackoverflow.com/questions/399850/best-compiler- warning-level-for-c-c-compilers. – EmeryBerger

+0

Lo extrañé, lo siento. – peoro

Respuesta

2

No es exactamente la misma categoría, pero siempre compilo con -Werror para marcar advertencias como errores. Muy útil.

Para que esto funcione con los encabezados de terceros, incluyo esos encabezados a través de -isystem en lugar de -I ... de lo contrario, las advertencias en esos encabezados romperán la compilación.

También hay -Weffc++ que advierte por problemas específicos descritos en Meyers 'Efectivo C++. Sin embargo, he encontrado esto demasiado duro. Por ejemplo, advierte para las clases base que no declaran destructores virtuales. En teoría, esto es muy bueno, pero estoy trabajando en una biblioteca de plantillas que usa herencia para la reutilización de código (y clases de política) y obviamente no tienen (ni necesitan) destructores virtuales.

+0

Acepto que '-WeffC++' es demasiado duro. De vez en cuando, compilo con él para verificar mi código. – maxelost

+1

Irónicamente, '-WeffC++' advierte acerca de derivar de la clase de política 'boost :: noncopyable', pero la recomendación de Effecting C++ es heredar de dicha clase. Del mismo modo, advierte sobre la herencia de 'std :: unary_function' y amigos. GCC debería ser un poco más inteligente aquí: una clase sin miembros de datos y sin funciones de miembro público es poco probable que se use polimórficamente. – Philipp

+1

@Philipp: Se conocen los problemas y hay varios errores y discusiones archivados en la lista de correo de GCC sobre eso ... Sin embargo, no veo que esto se resuelva pronto. –

1

Algunas que he visto que se usan;

-Wcast-qual: Advierta cada vez que se lanza un puntero para eliminar un calificador de tipo del tipo de destino. Por ejemplo, advierta si un const char * se convierte a un char * ordinario.

-Wpointer-arith: advierta sobre cualquier cosa que dependa del tamaño de un tipo de función o de void. GNU C asigna a estos tipos un tamaño de 1, para mayor comodidad en los cálculos con void * punteros y punteros a las funciones.

-Wwrite-strings: Al compilar C, dará constantes de cadena del tipo const char[length] modo que copiar la dirección de uno en un puntero no constchar * obtendrá una advertencia; al compilar C++, advierta sobre la conversión en desuso de los literales de cadena a char *. Esta advertencia, de forma predeterminada, está habilitada para programas C++. Estas advertencias lo ayudarán a encontrar en el código de tiempo de compilación que puede intentar escribir en una constante de cadena, pero solo si ha tenido mucho cuidado al usar const en declaraciones y prototipos. De lo contrario, solo será una molestia; esta es la razón por la que no hicimos -Wall solicita estas advertencias.

-Wdisabled-optimization: Avisar si un pase de optimización solicitado está deshabilitado. Esta advertencia generalmente no indica que haya algún problema con su código; simplemente indica que los optimizadores de GCC no pudieron manejar el código de manera efectiva. A menudo, el problema es que su código es demasiado grande o demasiado complejo; GCC se rehusará a optimizar los programas cuando la optimización en sí misma pueda tomar cantidades de tiempo excesivas.

2

Ver Best compiler warning level for C/C++ compilers?. Una publicación contiene la siguiente lista exhaustiva (y exhaustiva).

-g -O -Wall -Weffc++ -pedantic \ 
    -pedantic-errors -Wextra -Wall -Waggregate-return -Wcast-align \ 
    -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion \ 
    -Wdisabled-optimization \ 
    -Werror -Wfloat-equal -Wformat -Wformat=2 \ 
    -Wformat-nonliteral -Wformat-security \ 
    -Wformat-y2k \ 
    -Wimplicit -Wimport -Winit-self -Winline \ 
    -Winvalid-pch \ 
    -Wunsafe-loop-optimizations -Wlong-long -Wmissing-braces \ 
    -Wmissing-field-initializers -Wmissing-format-attribute \ 
    -Wmissing-include-dirs -Wmissing-noreturn \ 
    -Wpacked -Wpadded -Wparentheses -Wpointer-arith \ 
    -Wredundant-decls -Wreturn-type \ 
    -Wsequence-point -Wshadow -Wsign-compare -Wstack-protector \ 
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default \ 
    -Wswitch-enum -Wtrigraphs -Wuninitialized \ 
    -Wunknown-pragmas -Wunreachable-code -Wunused \ 
    -Wunused-function -Wunused-label -Wunused-parameter \ 
    -Wunused-value -Wunused-variable -Wvariadic-macros \ 
    -Wvolatile-register-var -Wwrite-strings 
+0

Algunos de ellos son redundantes. Por ejemplo, el segundo '-Wall' y el' -Wcomment' son ambos implicados por el primer '-Wall'. '-Werror' +' -pedantic' implica '-pedantic-errors'. –

+1

De hecho. En cualquier caso, es excesivo. Pero es un buen punto de partida. – EmeryBerger

1

En general habilito todas las advertencias y luego quito aquellas banderas selectivamente que dan salidas inútiles. En uno de mis proyectos, utilizo el siguiente C y advertencias C++:

-pedantic 
-Wall 
-Wextra 
-Wformat=2 
-Wmissing-include-dirs 
-Wswitch-default 
-Wswitch-enum 
-Wunused 
-Wstrict-aliasing=1 
-Wfloat-equal 
-Wundef 
-Wunsafe-loop-optimizations 
-Wpointer-arith 
-Wcast-qual 
-Wcast-align 
-Wwrite-strings 
-Wconversion 
-Wmissing-format-attribute 
-Wpacked 
-Wredundant-decls 
-Winvalid-pch 
-Wvolatile-register-var 
-Wsync-nand 
-Wsign-conversion 
-Wlogical-op 
-Wmissing-declarations 
-Wmissing-noreturn 
-Wstrict-overflow=5 
-Wstack-protector 

Además, utilizo los siguientes C banderas ++:

-std=c++98 
-Wnon-virtual-dtor 
-Wctor-dtor-privacy 
-Wstrict-null-sentinel 
-Woverloaded-virtual 
-Wsign-promo 

Además, para la versión de lanzamiento habilito la siguiente advertencias:

-pedantic-errors 
-Werror 
-Wuninitialized 
-Winit-self 
-Wdisabled-optimization 

me resulta bastante molesto que -Wall permite sólo el mínimo absoluto de advertencias en lugar de "todos", como su nombre indica.

+0

Hubiera pensado que '-Wdisabled-optimization -Werror' es un poco valiente en el modo de lanzamiento. Rechace cualquier código que no sea adecuado para * todas * optimizaciones. ¿O es un truco para hacer cumplir pequeñas funciones? ;-) –

+0

@Steve Jessop: Para ese proyecto (que es muy pequeño) funciona, pero para otros proyectos desactivaría esa bandera si causara advertencias. Además, '-Wswitch-enum' puede volverse bastante molesto para grandes enumeraciones. – Philipp

1

Además de los ya mencionados anteriormente:

-pedantic     Issue warnings needed for strict compliance to the standard 
-Wall 
-Wextra      Print extra (possibly unwanted) warnings 
-Werror      Treat all warnings as errors 
-std=c++0x     Conform to the ISO 1998 C++ standard, with extensions that are likely to be in C++0x 
-std=c++98     Conform to the ISO 1998 C++ standard 
Cuestiones relacionadas