2009-01-29 13 views
17

Ich arbeite an einem großen gemeinschaftlichen C++ - Projekt, das sowohl entwickelt als auch auf verschiedenen Varianten von Linux, OS X und Windows ausgeführt wird. Wir kompilieren über diese Plattformen mit GCC, Visual Studio C++ und dem Intel C++ Compiler. Wenn mehr und mehr Leute anfangen, Code für das Projekt zu entwickeln, fangen wir an, seltsame Fehler bei der Kompilierung und Laufzeit zu bemerken, die spezifisch für bestimmte Compiler auf bestimmten Betriebssystemen sind. Ein Beispiel hierfür ist die implizite Einbeziehung von Headern, die bestimmte OS/Compiler-Paare für Sie zu finden scheinen, indem sie versehentlich eine Funktion aus einer Basisklasse in einer abgeleiteten Klasse überladen.Erstellen von GCC und anderen C++ - Compilern Sehr streng

Mein Ziel ist es, die Kompilierung in GCC strenger zu machen und mehr Fehler auf allen Plattformen zu erfassen, so dass wir nicht weiter auf diese Probleme stoßen. Hier ist meine Liste von Flags, die ich über das Ausprobieren für GCC denke, dass ich über Google und die GCC-man-Seiten gefunden habe:

  • -Wall
  • -Wextra
  • -Winit-Selbst
  • -Wold-style-Guss
  • -Woverloaded-virtuelle
  • -Wuninitialized
  • -Wmissing-Erklärungen
  • -Wini t-Selbst
  • -ansi
  • -pedantic

Was die anderen Flags sind, die Menschen benutzen GCC (und weniger wichtig Visual Studio C++ und die Intel C++ Compiler) gehorchen einen strengeren Standard der C zu machen ++ Sprache? Seien Sie konkret, über welchen Compiler und welche Version Sie sprechen, da einige davon möglicherweise nicht in allen Versionen aller Compiler implementiert sind.

Antwort

8

Neben dem pedantischen Fehler, den alle anderen vorgeschlagen haben, IMO, ist es immer gut, lint als Teil Ihres Kompilierprozesses auszuführen.

Es gibt einige Tools gibt:

Sie werden eine Menge Zeit sparen.

+0

Es gibt viele kommerzielle Tools zur Verfügung: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B. Wenn Sie ein kommerzielles Tool investieren möchten, können Sie normalerweise Test-/Evaluierungsversionen erhalten. –

+0

Danke. Es ist gut zu wissen. – KOkon

3

Sie können pedantische Warnungen in Fehler mit -pedantic-errors machen. Dies verhindert, dass Entwickler es ignorieren. In diesem Fall könnten Sie auch alle Warnungen zu Fehlern machen mit -Werror, obwohl das in einigen Fällen kontraproduktiv sein kann (vielleicht nicht in Ihrem Fall).

Insgesamt denke ich, soweit die Einhaltung eines strengen Standards geht, sind die -pedantic Optionen die hilfreichsten.

1

In ähnlicher Situation gaben wir auf und bewegten uns zu ACE framework, versteckt den Unterschied zwischen den Plattformen.

3

-pedantische Fehler.

Weitere Informationen finden Sie unter gcc(1).

2

Ebenso wie -pendantic sollten Sie auch einen -std Schalter zur Verfügung stellen. Wenn Sie eine strengere Kompilierung benötigen, sollten Sie wissen, welchem ​​Standard Sie sich anpassen möchten. In der Regel für aktuelle C++ wäre dies -std=c++98. (-ansi führt eine ähnliche Funktion im C++ Modus aus, aber -std= ist expliziter.)

+0

Beachten Sie auch, dass -ansi und -std = C++ 11 Konflikt miteinander, was zu C++ 98, nicht C++ 11. – pilkch

3

Kopieren Sie und fügen Sie unter Zeile in Ihre Master cmake-Datei. Unter Linie enthält fast die meisten nützlichen Compiler-Flags, um sich selbst strenger zu testen.

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") 

Wenn Sie cmake nicht verwenden kopieren Sie einfach Flags, das in doppelten Anführungszeichen und

1

ich the blog post nach der Erforschung zu diesem Thema mehr Optionen schrieb an Ihren Compiler senden. Sie müssen auch die Fälle behandeln, in denen Sie andere Bibliotheken verwenden, aber sie befolgen keine strenge Kompilierung. Glücklicherweise gibt es auch einen einfachen Weg, mit ihnen umzugehen. Ich habe das in all meinen Projekten ausgiebig genutzt.

Kurz gesagt, die Verwendung folgenden Compiler-Optionen aktivieren sehr strikten Modus (unten ist, was ich in CMakeLists.txt) setzen:

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}") 

Sie mehr darüber lesen können, wie zum Ein- und Ausschalten dieser strikten Modus für bestimmte Teile des Codes hier: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/