2009-01-29 11 views
17

Je travaille sur un grand projet C++ collaboratif qui est à la fois développé et exécuté sous différentes versions de Linux, OS X et Windows. Nous compilons sur ces plateformes avec GCC, Visual Studio C++ et le compilateur Intel C++. Alors que de plus en plus de gens commencent à développer du code pour le projet, nous commençons à voir des erreurs étranges dans la compilation et l'exécution qui sont spécifiques à des compilateurs particuliers sur des systèmes d'exploitation particuliers. Un exemple de ceci est l'inclusion implicite des en-têtes que certaines paires OS/compilateurs semblent trouver pour vous, surchargeant accidentellement une fonction d'une classe de base dans une classe dérivée.Rendre les compilateurs GCC et autres C++ très stricts

Mon but est de rendre la compilation sur GCC plus stricte et d'attraper plus d'erreurs sur toutes les plateformes afin de ne pas continuer à courir dans ces problèmes. Voici ma liste des drapeaux que je pense à essayer pour GCC que j'ai trouvé via Google et l'homme du CCG pages:

  • -Wall
  • -Wextra
  • -Winit auto
  • -Wold style coulé
  • -Woverloaded virtuel
  • -Wuninitialized
  • -Wmissing-déclarations
  • -Wini t-auto
  • -ansi
  • -pedantic

Quels sont les autres drapeaux que les gens utilisent pour faire du CCG (et moins important Visual Studio C++ et le compilateur Intel C++) obéissent à une norme plus stricte du C++ la langue? Soyez précis sur le compilateur et la version dont vous parlez, car certains d'entre eux peuvent ne pas être implémentés dans toutes les versions de tous les compilateurs.

Répondre

8

Outre l'erreur pédant que tout le monde a suggéré, il est toujours bon d'exécuter lint dans le cadre de votre processus de compilation.

Il y a quelques outils là-bas:

Ils économiser beaucoup de votre temps.

+0

De nombreux outils commerciaux sont disponibles: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B. Si vous souhaitez investir un outil commercial, vous pouvez normalement obtenir des versions d'essai/d'évaluation. –

+0

Merci. C'est bon à savoir. – KOkon

3

Vous pouvez faire des avertissements pédantes en erreurs avec -pedantic-errors. Cela empêchera les développeurs de l'ignorer. Pour cette raison, vous pouvez également faire toutes les erreurs dans les erreurs avec -Werror bien que cela puisse être contre-productif dans certains cas (peut-être pas dans le vôtre cependant).

Dans l'ensemble, je pense, dans la mesure où adhérer à une norme stricte va, les options -pedantic sont les plus utiles.

1

Dans une situation similaire, nous avons abandonné et déplacé à ACE framework, en cachant la différence entre les plates-formes.

3

-pedantic-errors.

Plus sur gcc(1).

2

En plus de -pendantic, vous devez également fournir un commutateur -std. Si vous avez besoin d'une compilation plus stricte, vous devriez savoir à quelle norme vous essayez de vous conformer. Typiquement pour C++ actuel ce serait -std=c++98. (-ansi exécute une fonction similaire en mode C++, mais -std= est plus explicite.)

+0

Notez également que -ansi et -std = C++ 11 entrent en conflit les uns avec les autres, ce qui entraîne C++ 98, pas C++ 11. – pilkch

3

Copiez et collez la ligne ci-dessous dans votre fichier master cmake. Au-dessous de la ligne comprend presque tous les drapeaux de compilateur utiles afin de vous tester plus strict.

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 vous n'utilisez pas CMake copie juste des drapeaux que des guillemets doubles et envoyer à votre compilateur

1

J'ai écrit the blog post sur ce sujet après avoir étudié plusieurs options. Vous devez également gérer les cas dans lesquels vous utilisez d'autres bibliothèques, mais ils ne suivent pas une compilation stricte. Heureusement, il existe un moyen facile de les gérer aussi bien. Je l'ai largement utilisé dans tous mes projets.

En bref, après l'utilisation des options du compilateur pour activer le mode très strict (ci-dessous est ce que je mets 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}") 

Vous pouvez en savoir plus sur comment activer et désactiver ce mode strict pour des portions spécifiques de code ici: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/