Nach C ++ 11-Bibliotheksfunktionen suchen

8

Was ist eine gute Möglichkeit, das Vorhandensein bestimmter C ++ 11-Funktionen der Standardbibliothek zu überprüfen?

Für Compiler-Funktionen habe ich gerade die Compiler-Version für die (IMHO) großen Compiler ( VC ++ , gcc , clang im Moment, vielleicht Intel ) Obwohl dies nicht der beste und flexibelste Ansatz ist, weiß ich nichts Besseres, außer clang was wirklich hat nice __has_feature macros.

Aber es ist noch schlimmer für Bibliotheksfunktionen, die nicht starr mit dem Compiler gekoppelt sind. Im Moment möchte ich den gleichen Ansatz verwenden, um die Compiler-Version für VC ++ zu überprüfen (wo es ziemlich einfach ist, vorausgesetzt, es verwendet eine eigene Bibliothek). Für clang kann ich zumindest __has_include für große Header-basierte Abfragen verwenden. Abgesehen davon, ich denke, überprüfen __GLIBCXX__ s Wert, wenn definiert, könnte eine gute Idee sein, aber dann wieder ich finde keine Informationen, welche bestimmte libstdc ++ Versionen eingeführt, welche Funktionen, anders als die aktuelle Version unterstützt.

Die Methoden sollten auf Präprozessor-Überprüfungen und dergleichen beschränkt bleiben, da ich sie in einer Header-only-Bibliothek ohne komplizierte Konfigurationsprozedur und ohne Verwendung von Bibliotheken von Drittanbietern verwenden möchte (und ja, boost ist ein Drittanbieter).

  1. Was sind meine Möglichkeiten, nach bestimmten C ++ 11-Bibliotheksfunktionen unter diesen (ziemlich engen) Bedingungen zu suchen? Vielleicht sogar auf der Skala bestimmter Funktionen oder Arten erklärt?

  2. Wenn die Suche nach dem Compiler oder der Bibliothek immer noch der beste Ansatz ist, wo finde ich detaillierte Informationen zu den speziellen C ++ 11-Funktionen, die von einer spezifischen Version von unterstützt werden libstdc ++ (und vielleicht andere wichtige, libc ++ vielleicht)?

FWIW im Moment bin ich interresiert in <cstdint> , C ++ 11 <cmath> functions und std::hash , aber das kann sich ändern und ist wahrscheinlich nicht wichtig für den allgemeinen Ansatz.

    
Christian Rau 09.08.2012, 15:00
quelle

2 Antworten

9

Es gibt wirklich nichts Nettes, was Sie hier tun können, außer zu wissen, welcher Compiler in welcher Version was implementiert und die richtigen Definitionen hat.

gcc hat eine spezielle Tabelle für Bibliotheksfunktionen. Das Hauptproblem von __has_include sind natürlich Ergänzungen zum Standard, die in alten Includes leben. libstdc++ hat auch die notwendigen Includes, aber das bedeutet nicht die notwendige Definition, um den Inhalt dieser Dateien zu aktivieren. Es wird auch nichts über die tatsächliche Menge der verfügbaren Implementierung sagen (die manchmal unvollständig ist).

Da Sie eine Header-only-Bibliothek haben, trifft dies nicht auf Sie zu, ist aber immer noch wichtig: Die binäre Inkompatibilität zwischen C ++ 11 und C ++ 03 kann Sie zurückwerfen und Sie beißen.

Ich würde ernsthaft nichts davon alleine angehen und stattdessen Boost.Config . Ursprünglich hat es nur Sprachfunktionen beschrieben, ist jetzt jedoch auf Standardbibliotheksheader erweitert worden.

    
pmr 09.08.2012 15:07
quelle
3

Sie könnten autoconf-Makros schreiben, um sie zu überprüfen, und wenn Sie dies tun, reichen Sie sie Ссылка ein
Die einzige relevante bisher überprüft für vollständige Abdeckung, nicht für einzelne Funktionen: Ссылка Aber das erfordert keine komplizierten Konfigurationsüberprüfungen.

  

Abgesehen davon würde ich den Wert von __GLIBCXX__ überprüfen, wenn dies eine gute Idee ist,

Der Wert von __GLIBCXX__ ist nicht nützlich, enthält das Datum, an dem die Version veröffentlicht wurde , was fast nichts über die Version aussagt (zB 4.6.3 wird nach 4.7.0 veröffentlicht, hat also ein späteres Datum in __GLIBCXX__ , hat aber weniger C ++ 11-Funktionen.) Wann Mit libstdc ++ mit GCC möchten Sie die allgemeinen GCC-Versionsnummern in __GLIBC__ und __GLIBC_MINOR__ zum Prüfen von Versionen verwenden (im Allgemeinen können Sie nur eine bestimmte Version von libstdc ++ mit der GCC-Version verwenden, mit der es geliefert wurde.)

Bearbeiten: Beginnend mit GCC 7 gibt es ein neues Makro, definiert durch die Header libstdc ++, _GLIBCXX_RELEASE , das auf den gleichen Wert wie GCC __GNUC__ definiert ist, aber auch wenn es noch verwendbar ist Verwenden der Header libstdc ++ mit Nicht-GCC-Compilern.

  

aber dann kann ich keine Informationen darüber finden, welche spezifischen libstdc ++ - Versionen welche Funktionen eingeführt haben, außer was die aktuelle Version unterstützt.

Die libstdc ++ C ++ 11 Statustabellen für frühere Releases sind online verfügbar, wo alle GCC Dokumente leben: Ссылка

Für 4.7 ist es bei Ссылка und für 4.6 ist es bei Ссылка und für frühere Releases ist in der Quelle enthalten (aber die Abdeckung in Releases vor 4.6 ist sowieso ziemlich lückenhaft.)

Einige hinzugefügte Funktionen sind in den Versionshinweisen für jede Version aufgeführt, z. Ссылка (im Abschnitt libstdc ++)

Bearbeiten: Für die Unterstützung von C ++ 17-Bibliotheken listen wir jetzt auf, welche Version zuerst die Funktion hinzugefügt hat. Sie müssen sich also nur die neueste Dokumentation ansehen: Ссылка

  

FWIW im Moment bin ich interresiert in <cstdint> , C ++ 11 <cmath> functions und std::hash

Sie sollten in allen Versionen von libstdc ++ vorhanden sein, die C ++ 0x / C ++ 11 unterstützen.

    
Jonathan Wakely 12.08.2012 20:02
quelle