2009-01-29 7 views
17

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.Hacer GCC y otros compiladores de C++ Muy estricto

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 en probar para GCC que he encontrado a través de Google y el hombre páginas CCG:

  • -Wall
  • -Wextra
  • -Winit-auto
  • de estilo fundido -Wold
  • -Woverloaded virtual
  • -Wuninitialized
  • -Wmissing-declaraciones
  • -Wini t-auto
  • -ansi
  • -pedantic

¿Cuáles son las otras banderas que usa la gente para hacer GCC (y menos importante el estudio visual C++ y el compilador de C de Intel ++) obedecen a una norma más estricta de la C++ ¿idioma? 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.

Respuesta

8

Además del pedante error 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í:

van a ahorrar mucho de su tiempo.

+0

Hay muchas herramientas comerciales disponibles: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B. Si desea invertir una herramienta comercial, normalmente puede obtener versiones de prueba/evaluación. –

+0

Gracias. Es bueno saberlo. – KOkon

3

Puede hacer advertencias pedantes en errores con -pedantic-errors. Esto evitará que los desarrolladores lo ignoren. En ese 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 adhiere a un estricto estándar va, los -pedantic opciones son las más útiles.

1

En una situación similar nos damos por vencidos y nos mudamos a ACE framework, ocultando la diferencia entre las plataformas.

3

-pedantic-errors.

Ver mĆ ons en gcc(1).

2

Además de -pendantic, también debe proporcionar un interruptor -std. 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.)

+0

Tenga en cuenta también que -ansi y -std = C++ 11 entran en conflicto entre sí, lo que resulta en C++ 98, no en C++ 11. – pilkch

3

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 usted no utiliza cmake simplemente copiar banderas que entre comillas dobles y enviar a su compilador

1

escribí the blog post 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 uso, las opciones del compilador siguientes cortos para activar el modo muy estricto (a continuación es 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}") 

Usted puede leer más acerca de cómo activar y desactivar este modo estricto para partes específicas del código aquí: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/

Cuestiones relacionadas