Frage

Ich bin auf einem großen kollaborativen C ++ Projekt arbeiten, das sowohl entwickelt und auf verschiedene Varianten von Linux, OS X und Windows. Wir erstellen für diese Plattformen mit GCC, Visual Studio C ++ und der Intel C ++ Compiler. Da immer mehr Menschen für das Projekt zu entwickeln Code beginnen, starten wir seltsame Fehler in der Zusammenstellung und Laufzeit, die spezifisch für bestimmte Compiler auf bestimmten Betriebssystemen zu sehen. Ein Beispiel hierfür ist implizite Einbeziehung von Headern, dass bestimmte OS / Compiler-Paare für Sie zu finden scheinen, aus Versehen eine Funktion von einer Basisklasse in einer abgeleiteten Klasse überlastet.

Mein Ziel ist es strenge Kompilation auf GCC zu machen und mehr Fehler auf allen Plattformen zu fangen, damit wir nicht halten in diese Probleme laufen. 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-self
  • -Wold-style-Guss
  • -Woverloaded-virtual
  • -Wuninitialized
  • -Wmissing-Erklärungen
  • -Winit-self
  • -ansi
  • -pedantic

Was sind die anderen Flaggen, die Menschen benutzen GCC (und weniger wichtig Visual Studio C ++ und die Intel C ++ Compiler) gehorcht einen strengeren Standard der Sprache C ++ zu machen? Seien Sie konkret über die Compiler und Version Sie sprechen, wie einige von ihnen möglicherweise nicht in allen Versionen von allen Compilern implementiert werden.

War es hilfreich?

Lösung

Neben dem pedantisch-Fehler, dass alle anderen vorgeschlagen, IMO, ist es immer gut Flusen als Teil Ihrer Kompilierung ausgeführt werden.

Es gibt einige Tools gibt:

Sie werden eine Menge Zeit sparen.

Andere Tipps

Sie können machen pedantisch Warnungen in Fehler mit -pedantic-errors. Dies verhindert, dass Entwickler aus, ihn zu ignorieren. Für diese Angelegenheit könnten Sie alle Warnungen in Fehler als auch mit -Werror machen, obwohl das in manchen Fällen kontraproduktiv sein kann (vielleicht nicht in Ihrem obwohl).

Insgesamt denke ich, so weit wie einem strengen Standard entspricht geht, sind die -pedantic Optionen das nützlichste.

-pedantic-Fehler.

Sehen Sie mehr über gcc (1) .

Kopieren Sie unter der Zeile in Ihre Master cmake-Datei. unterhalb der Linie umfasst fast nützlichsten Compiler-Flags, um sich mehr 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 nicht cmake nur Fahnen kopieren, die in doppelten Anführungszeichen und zu Ihrem Compiler senden

Neben -pendantic sollten Sie auch einen -std Schalter bieten. Wenn Sie ein strenger kompilieren müssen, dann sollten Sie wissen, welche Faktoren man zu entsprechen versuchen. Typisch für Strom c ++ würde dies -std=c++98 werden. (-ansi führt eine ähnliche Funktion in C ++ Modus, aber -std= ist expliziter.)

In ähnliche Situation haben wir aufgegeben und bewegt href="http://www.cs.wustl.edu/~schmidt/ACE.html" rel="nofollow noreferrer"> ACE Rahmen

Ich schrieb der Blog-Post zu diesem Thema nach mehreren Optionen zu erforschen. Sie müssen auch die Fälle behandeln, in denen Sie anderen Bibliotheken verwenden, aber sie folgen nicht streng Kompilation. Glücklicherweise gibt es einfache Möglichkeit, sie als gut zu handhaben. Ich habe dies bereits mit großem Umfang in allen meinen Projekten.

Kurz gesagt, die Verwendung folgende 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 können mehr darüber lesen, 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/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top