Gibt es eine Möglichkeit, beim Kompilieren festzustellen, ob der Compiler bestimmte Funktionen von C ++ 11 unterstützt? Zum Beispiel so etwas:
#ifndef VARIADIC_TEMPLATES_SUPPORTED
#error "Your compiler doesn't support variadic templates. :("
#else
template <typename... DatatypeList>
class Tuple
{
// ...
}
#endif
template <typename... Test> struct compiler_must_support_variadic_templates;
. Ein Syntaxfehler würde das Problem schnell aufdecken. (Antworten:
Es gibt eine Konstante mit dem Namen ,
__cplusplus
dass C ++ Compiler auf die Version des C eingestellt sollte ++ Standard unterstützt diese sehenEs ist in Visual Studio 2010 SP1 auf 199711L eingestellt, aber ich weiß nicht, ob Anbieter so mutig sein werden, es bereits zu erhöhen, wenn sie nur (teilweise) Unterstützung auf Compilerebene im Vergleich zu einer Standard-C ++ - Bibliothek mit allen C ++ 11-Änderungen haben .
Daher bleiben die in einer anderen Antwort erwähnten Boost-Definitionen der einzig vernünftige Weg, um herauszufinden, ob beispielsweise C ++ 11-Threads und andere spezifische Teile des Standards unterstützt werden.
quelle
__cplusplus
auf201103L
. Dies bestätigt die vollständige Übereinstimmung mit dem Standard von 2011; Es sagt nichts über teilweise Konformität oder Compiler-Erweiterungen aus. Wenn eingestellt__cplusplus
ist201103L
, passt sich der Compiler entweder vollständig an oder er belügt Sie. Wenn dies nicht der Fall ist, können Sie nicht wirklich sagen, welche Funktionen unterstützt werden.-std=c++11
Option angegeben wird (möglicherweise auch mit-std=gnu++11
). Sie tun dies, obwohl sie noch nicht vollständig sind (4.8 bringt uns viel näher). Hinweis - Es gibt eine Lücke zwischen dem, was der Compiler unterstützt, und dem, was in der Standardbibliothek verfügbar ist. Sowohl 4.7.x als auch 4.8.x fehlen derzeit die Regex-Unterstützung - aber das ist eine Bibliothek, keine Compiler-Funktion.__cplusplus
zu199711L
für C ++ 11__cplusplus
auf gesetzt199711L
ist , ist kein konformer C ++ 11-Compiler. Sie haben wahrscheinlich Optionen, damit sie sich richtig verhalten.Wie im C ++ 11- Standard (§iso.16.8) angegeben:
Mit dem Wert dieses Makros können Sie überprüfen, ob der Compiler C ++ 11-kompatibel ist.
Wenn Sie nach einer Standardmethode suchen, um zu überprüfen, ob der Compiler eine beliebige Teilmenge der C ++ 11-Funktionen unterstützt, gibt es meines Erachtens keine standardmäßige, portable Methode. Sie können die Dokumentation des Compilers oder die Header-Dateien der Standardbibliothek überprüfen, um weitere Informationen zu erhalten.
quelle
Ich weiß, dass dies eine sehr alte Frage ist, aber diese Frage wird oft gesehen und die Antworten sind etwas veraltet.
Neuere Compiler mit dem C ++ 14-Standard bieten eine Standardmethode zum Überprüfen von Funktionen, einschließlich C ++ 11-Funktionen. Eine umfassende Seite finden Sie unter https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
Zusammenfassend ist für jede Funktion ein Standardmakro definiert, mit dem Sie überprüfen können
#ifdef
. Um beispielsweise nach benutzerdefinierten Literalen zu suchen, können Sie verwendenquelle
__has_include()
Makro.Zur Überprüfung der Unterstützung C ++ 14 und andere. Testen auf GCC 5.2.1.
quelle
Sie können dies verwenden:
Für C ++ 11 setzen die meisten Compiler außer Visual Studio das
__cplusplus
Makro auf201103L
, aber jede Version von Visual Studio legt es auf199711L
den Wert fest, der für andere Compiler vor C ++ 11 verwendet wurde. Dieser Code vergleicht das_cplusplus
Makro mit201103L
allen Compilern außer Visual Studio. Wenn der Compiler Visual Studio ist, wird überprüft, ob die Version von Visual Studio später als 2015 ist, der ersten Version von Visual Studio, die C ++ 11 vollständig unterstützt (für Visual Studio 2015 hat das_MSC_VER
Makro den Wert1900
, siehe diese Antwort ).quelle
g++ -std=c++98
GCC 4.8 wird falsch gedrucktC++11 is supported
.Wenn Sie Boost.Config nicht verwenden möchten und nach Compilern testen müssen, die C ++ 11 unterstützen, reicht es aus, den Wert der Konstante zu überprüfen
__cplusplus
. Ein Compiler unterstützt jedoch möglicherweise die meisten gängigen Funktionen des C ++ 11-Standards, unterstützt jedoch nicht die gesamten Spezifikationen. Wenn Sie die Unterstützung für bestimmte Visual Studio-Compiler aktivieren möchten, die noch nicht 100% den C ++ 11-Spezifikationen entsprechen, verwenden Sie das folgende Codefragment, mit dem Sie in Visual Studio 2013 kompilieren können:Eine vollständige Liste der Versionen des Compilers für Visual Studio finden Sie unter So erkennen Sie, ob ich Code mit Visual Studio 2008 kompiliere
quelle
In der traditionellen Linux / Unix-Welt wird Autoconf traditionell verwendet, um das Vorhandensein von Bibliotheken und Compilerfunktionen sowie Fehler zu testen, die in eine config.h eingefügt werden, die Sie bei Bedarf in Ihren Dateien verwenden.
quelle
Wenn Sie nach einer Verfügbarkeit der C ++ 11-Bibliothek suchen (keine Sprachfunktion), z. B. nach dem
<array>
Header, können Sie dies tun#if __has_include(<array>)
.Manchmal überprüft
#if __cplusplus >= 201103L
würden Sie sagen , dass Sie C ++ verwenden , 11 aber auch andere Einstellungen wie die Standardbibliothek Version Einstellung in Xcode kann immer noch nicht die neuen Bibliotheken zur Verfügung haben ( die meisten von ihnen in verschiedenen Namen verfügbar sind , dh<tr1/array>
)quelle