ejecutar - Hacer GCC y otros compiladores de C++ muy estrictos
Estoy trabajando en un gran proyecto colaborativo de C ++ que está desarrollado y se ejecuta en varios sabores de Linux, OS X y Windows. Compilamos en todas estas plataformas con GCC, Visual Studio C ++ y el compilador Intel C ++. A medida que más y más personas comienzan a desarrollar código para el proyecto, comenzamos a ver errores extraños en la compilación y en el tiempo de ejecución que son específicos de compiladores particulares en sistemas operativos particulares. Un ejemplo de esto es la inclusión implícita de encabezados que ciertos pares de OS / compiladores parecen encontrar para usted, sobrecargando accidentalmente una función de una clase base en una clase derivada.
Mi objetivo es hacer que la compilación en GCC sea más estricta y atrapar más errores en todas las plataformas para que no sigamos encontrándonos con estos problemas. Aquí está mi lista de banderas que estoy pensando probar para GCC que he encontrado a través de Google y las páginas man de GCC:
- -Pared
- -Wextra
- -Winit-self
- -Wold-style-cast
- -Woverloaded-virtual
- -Inicializado
- -Wmissing-declarations
- -Winit-self
- -ansi
- -pedante
¿Cuáles son las otras banderas que las personas usan para hacer que GCC (y menos importante, Visual Studio C ++ y el compilador Intel C ++) obedezcan un estándar más estricto del lenguaje C ++? Sea específico acerca del compilador y la versión de la que está hablando, ya que algunos de ellos podrían no implementarse en todas las versiones de todos los compiladores.
Además de -pendantic
también debe proporcionar un -std
switch. Si necesita una compilación más estricta, debe saber a qué nivel está tratando de ajustarse. Típicamente para c ++ actual esto sería -std=c++98
. ( -ansi
realiza una función similar en el modo C ++, pero -std=
es más explícito.)
Además del error pedante que todos los demás sugirieron, IMO, siempre es bueno ejecutar la pelusa como parte de su proceso de compilación.
Hay algunas herramientas por ahí:
- cpplint (gratis)
- gintle pelusa
- cubrición
Le ahorrarán mucho tiempo.
En una situación similar, nos dimos por vencidos y nos movimos al marco de ACE , ocultando la diferencia entre las plataformas.
Puede hacer advertencias pedantes en errores con -pedantic-errors
. Esto evitará que los desarrolladores lo ignoren. Para el caso, también podría convertir todas las advertencias en errores con " -Werror
aunque puede ser contraproducente en algunos casos (aunque tal vez no en el suyo).
En general, creo que, en lo que se refiere a cumplir con un estándar estricto, las opciones -pedantic
son las más útiles.
Copie y pegue debajo de la línea en su archivo master cmake. debajo de la línea se encuentran casi todos los indicadores de compilación más útiles para probarse a sí mismo de manera más estricta.
set(CMAKE_CXX_FLAGS "-O0 -fno-elide-constructors -pedantic-errors -ansi -Wextra -Wall -Winit-self -Wold-style-cast -Woverloaded-virtual -Wuninitialized -Wmissing-declarations -Winit-self -std=c++98")
Si no usa cmake simplemente copie los indicadores que están entre comillas dobles y envíelos a su compilador
Escribí la publicación del blog sobre este tema después de investigar varias opciones. También necesita manejar los casos en los que está utilizando otras bibliotecas, pero no están siguiendo una compilación estricta. Afortunadamente, también hay una manera fácil de manejarlos. He estado usando esto extensivamente en todos mis proyectos.
En resumen, use las siguientes opciones del compilador para activar el modo muy estricto (a continuación se muestra lo que puse en CMakeLists.txt):
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wstrict-aliasing -pedantic -fmax-errors=5 -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option ${CMAKE_CXX_FLAGS}")
Puede leer más sobre cómo activar y desactivar este modo estricto para porciones específicas de código aquí: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/