In a früheren Beitrag haben wir das Tool clang-tidy vorgestellt, mit dem sich Stellen erkennen lassen, an denen neue C++11/C++14/C++17-Features zur Modernisierung des C++-Quellcodes eingesetzt werden können. Doch wie lässt sich einfach feststellen, wo die neuen C++-Features in einem Projekt bereits verwendet werden?
Facebook und Google setzen C++11 in ihrem Quellcode intensiv ein. Wie wir in einem früheren Beitrag, nutzt nahezu alle C++11-Features, und ich war neugierig, ob Microsoft den neuen C++11-Standard ebenfalls in seinem Open-Source-Code einsetzt.
Microsofts Open-Source-Projekte finden Sie in ihrem GitHub Repository. Einige davon sind lediglich an Microsofts Anforderungen angepasste Forks anderer Projekte wie LLVM, Clang und OpenCV, andere werden direkt von Microsoft entwickelt. Sehen wir uns eines dieser Projekte an und prüfen, ob C++11 dort eingesetzt wird. Eine gute Wahl ist eines der neueren Open-Source-C/C++-Projekte von Microsoft: WinObjc.
Windows Bridge for iOS (auch WinObjC genannt) ist ein Open-Source-Projekt von Microsoft, das eine Objective-C-Entwicklungsumgebung für Visual Studio/Windows bereitstellt. Darüber hinaus unterstützt WinObjC die Kompatibilität mit iOS-APIs.
Eine Möglichkeit herauszufinden, wo C++11 eingesetzt wird, besteht darin, jede Quelldatei einzeln zu untersuchen. Je nach Projektgröße kann das Stunden oder sogar Tage dauern. Eine andere Lösung ist Clang.
Clang und seine leistungsfähige Diagnose-Engine helfen weiter.
Das Clang-Team möchte Fehlermeldungen so klar und informativ wie möglich gestalten. Für einen Kommandozeilen-Compiler sollen sie möglichst benutzerfreundlich sein. Dazu zeigt Clang präzise, was im Code nicht stimmt. Eine Diagnose-Engine verarbeitet die Fehlerinformationen und erzeugt daraus verständliche Meldungen.
Clang erzeugt zahlreiche Arten von Diagnosen. Für unseren Zweck sind insbesondere Meldungen mit einer Beschreibung wie „XXX incompatible with C++98“ interessant.
Doch wie erhalten wir die Clang-Diagnosen für eine Visual-Studio-Solution?
Die erste Möglichkeit besteht darin, die Projekte mit Clang zu kompilieren. Das ist allerdings nicht ganz einfach, denn dafür muss der Build-Prozess so geändert werden, dass Clang anstelle des Microsoft-Compilers verwendet wird.
Die zweite Möglichkeit besteht darin, Ihre Visual-Studio-Projekte mit CppDepend, which uses Clang as its front-end parser and reports all its diagnostics. CppDepend is für die Open-Source-Community kostenlos.
Hier sehen Sie alle Clang-Diagnosen für die WinObjC-Solution.

In unserem Fall benötigen wir jedoch nur Diagnosen vom Typ „incompatible with C++98“. Die vorherige Abfrage lässt sich leicht filtern, sodass nur diese Diagnosen angezeigt werden:

Wie wir sehen, werden die Features nullptr und auto an vielen Stellen im Quellcode verwendet. Anders als bei Projekten von Facebook und Google sind C++11-Features insgesamt jedoch nicht besonders weit verbreitet. Bei der Untersuchung der C++-Quelldateien von WinObjC fällt außerdem auf, dass das Projekt stärker auf C++/CX-Erweiterungen setzt.
Zusammenfassung:
Dank der hervorragenden Arbeit der C++-Community werden die neuen C++-Standards immer häufiger eingesetzt. Viele der neuen Features sind einfach zu verwenden, und die Modernisierung Ihres C++-Codes kann dessen Lesbarkeit und Wartbarkeit deutlich verbessern.
