Ich würde gerne eine "portable" C ++ - Bibliothek in Clang schreiben. "Portable" bedeutet, dass ich (im C-Präprozessor) feststelle, welche C ++ - Funktionen in der Kompilierungsumgebung verfügbar sind und diese Funktionen verwenden oder meine Problemumgehungen bereitstellen. Dies ist ähnlich den Boost-Bibliotheken.
Das Vorhandensein einiger Features hängt jedoch nicht von der Sprache ab, sondern von der Implementierung der Standardbibliothek. Insbesondere interessiert mich:
initializer_list
ist constexpr
. Ich finde das problematisch, weil Clang standardmäßig keine eigene Implementierung der Standardbibliothek verwendet: es verwendet libstdc ++. Während Clang Preprozessor-Makros __GNUC__
, __GNUC_MINOR__
, __GNUC_PATCHLEVEL__
vordefiniert hat, sind sie fest auf die Werte 4, 2 bzw. 1 geschrieben, und sie sagen mir wenig über die verfügbaren libstdc ++ - Funktionen.
Wie kann ich den Clang-Präprozessor einchecken, welche Version von libstdc ++ er verwendet?
Clang verfügt über eine eigene Standardbibliotheksimplementierung, die libc ++ heißt. Sie können es verwenden, indem Sie -stdlib=libc++
zu Ihrem Kompilierbefehl hinzufügen.
Dazu gibt es verschiedene Möglichkeiten, die Clang / libstdc ++ C ++ - Unterstützung zu überprüfen:
__has_feature
-Makro (und seine Freunde), mit denen Sprachfunktionen erkannt werden können und Spracherweiterungen. Und das hat mich zwei Minuten lang gegoogelt.
Tags und Links c++ clang c-preprocessor