No puedes
El manual para GCC 4.4.0 solo es completo para esa versión, pero enumera todas las advertencias posibles para 4.4.0. Sin embargo, no están todos en la página a la que se vincula, por ejemplo, algunas opciones específicas del idioma están en las páginas para las opciones de C ++ u Obj-C. Para encontrarlos todos, es mejor mirar el Resumen de opciones
Activar todo incluiría lo -Wdouble-promotion
que solo es relevante en las CPU con una unidad de punto flotante de precisión simple de 32 bits que se implementa float
en hardware, pero emula double
en software. Hacer cálculos como double
usaría la emulación de software y sería más lento. Eso es relevante para algunas CPU integradas, pero es completamente irrelevante para las CPU de escritorio modernas con soporte de hardware para punto flotante de 64 bits.
Otra advertencia que generalmente no es útil es -Wtraditional
, ¡que advierte sobre un código perfectamente bien formado que tiene un significado diferente (o no funciona) en las "string " "concatenation"
definiciones de funciones tradicionales de C, por ejemplo , o ISO C! ¿Realmente te importa la compatibilidad con compiladores de 30 años? ¿De verdad quieres una advertencia para escribir int inc(int i) { return i+1; }
?
Creo que -Weffc++
es demasiado ruidoso para ser útil, se basa en la primera edición obsoleta de Effective C ++ y advierte sobre construcciones que son C ++ perfectamente válidas (y para las cuales las pautas cambiaron en ediciones posteriores del libro). No quiero ser advirtió que no he inicializado un std::string
miembro en mi constructor; tiene un constructor predeterminado que hace exactamente lo que quiero, ¿por qué debería escribir m_str()
para llamarlo? Las -Weffc++
advertencias que serían útiles son demasiado difíciles para que el compilador las detecte con precisión (dando falsos negativos), y las que no son útiles, como la inicialización explícita de todos los miembros, solo producen demasiado ruido, dando falsos positivos.
Luc Danton proporcionó un gran ejemplo de advertencias inútiles -Waggregate-return
que casi nunca tienen sentido para el código C ++.
es decir, realmente no quieres todas las advertencias, solo piensas que sí.
Revise el manual, lea sobre ellos, decida qué desea habilitar, pruébelos. Leer el manual de su compilador es un Good Thing TM de todos modos, tomar un atajo y habilitar advertencias que no entiende no es una muy buena idea, especialmente si es para evitar tener que usar RTFM.
Cualquiera que simplemente encienda todo probablemente lo esté haciendo porque no tiene idea porque o un jefe de pelo puntiagudo dijo "no hay advertencias".
Algunas advertencias son importantes y otras no. Tienes que discriminar o arruinas tu programa. Consideremos, por ejemplo, -Wdouble-promotion
. Si está trabajando en un sistema integrado, es posible que desee esto; Si está trabajando en un sistema de escritorio, probablemente no. Qué y desea -Wtraditional
? Lo dudo.
Editar: Consulte también -Wall-all para habilitar todas las advertencias que se cierra como WONTFIX.
Edición 2: en respuesta a la queja de DevSolar sobre que los makefiles necesitan usar diferentes advertencias dependiendo de la versión del compilador, si -Wall -Wextra
no es adecuado, entonces no es difícil usar CFLAGS específicos del compilador y de la versión:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))