In einem früheren Beitrag haben wir das Tool clang-modernize vorgestellt, mit dem sich Stellen erkennen lassen, an denen neue C++11-Features zur Modernisierung des C++-Quellcodes eingesetzt werden könnten. Doch wie lässt sich einfach feststellen, wo die neuen C++-Features in einem Projekt tatsächlich 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 wollte wissen, ob Microsoft den neuen C++11-Standard ebenfalls in seinem Open-Source-Code eingesetzt hat.
Die Open-Source-Projekte von Microsoft finden Sie in deren GitHub Repository. Einige sind Forks anderer Projekte, die Microsoft an die eigenen Anforderungen angepasst hat, darunter LLVM, Clang und OpenCV; andere wurden direkt von Microsoft entwickelt. Sehen wir uns eines dieser Projekte an und prüfen wir, ob es C++11 verwendet. 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 bietet WinObjC Unterstützung für die Kompatibilität mit iOS-APIs.
Eine Möglichkeit, die Verwendung von C++11 zu prüfen, besteht darin, jede Quelldatei einzeln zu untersuchen. Je nach Projektgröße kann das Stunden oder sogar Tage dauern. Eine andere Lösung ist der Einsatz von Clang.
Clang und seine leistungsfähige Diagnose-Engine helfen weiter.
Das Clang-Team möchte Fehlermeldungen so klar und aussagekräftig wie möglich gestalten. Für einen Kommandozeilen-Compiler soll Clang möglichst benutzerfreundlich sein. Deshalb zeigt Clang sehr präzise, was im Code nicht stimmt. Eine Diagnose-Engine wandelt dazu Fehlerinformationen in verständliche Meldungen um.
Clang erzeugt zahlreiche Arten von Diagnosen. Für unseren Zweck sind insbesondere Meldungen mit Beschreibungen 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 jedoch nicht ganz einfach, denn dafür muss der Build-Prozess so angepasst 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 so filtern, dass ausschließlich diese Diagnosen angezeigt werden:

Wie zu erkennen ist, werden die Sprachfeatures nullptr und auto an vielen Stellen im Quellcode eingesetzt. Anders als bei den Projekten von Facebook und Google sind C++11-Features insgesamt jedoch nicht weit verbreitet. Bei der Untersuchung der C++-Quelldateien von WinObjC zeigt sich außerdem, dass C++/CX-Erweiterungen deutlich häufiger verwendet werden.
Zusammenfassung:
Manchmal ist es hilfreich zu wissen, ob ein C++-Projekt Features neuerer Standards verwendet und an welchen Stellen sie eingesetzt werden. Clang ist ein leistungsfähiges Werkzeug, um diese Informationen zu ermitteln.
