2012-05-15 13 views
22

Von clang 11 C++ 11 Support-Status-Website, http://clang.llvm.org/cxx_status.html, heißt es, "Initializer List" und "Lambda Expression" werden alle ab Version 3.1 unterstützt.Clang 3.1 und C++ 11 Unterstützungsstatus

Mit LLVM/Clang Trunk (3.2), kompiliert jedoch gegen Initializer-Liste und Lambda-Ausdruck Fehlermeldungen.

Weiß jemand, ob Clang> 3.1 diese Funktionen unterstützt?

+0

mögliche Duplikate von [Wie kann ich C++ 11 Funktionen in Clang verwenden?] (Http://stackoverflow.com/questions/10408849/how-cani-i-use-c-11-features-in-clang) –

Antwort

29

Standardmäßig aktiviert clang++ nicht die C++ 11-Funktionen - Sie haben to pass an additional flag during compilation.

clang++ -std=c++11 [input files...] 

Oder

# enables some additional C++11 extensions GCC has 
clang++ -std=gnu++11 [input files...] 

Zusätzlich können Sie zwischen libstdc++ und Clang eigenen libc++ verwenden, die verschiedene Implementierungen der C++ Standard-Bibliothek sind. libc++ kann in einigen Fällen eine bessere Implementierung des C++ 11-Standards als Ihre vorhandene libstdc++-Bibliothek haben.

# uses clang's C++ library in C++98 mode 
clang++ -stdlib=libc++ [input] # uses clang's C++ library 

# uses clang's C++ library and enables C++11 mode 
clang++ -stdlib=libc++ -std=c++11 [input] 

Letzteres ist wichtig, wenn Sie Clang in einer Umgebung mit einer veralteten Version von libstdc++ (wie Mac OSX) verwenden, aber beachten Sie, dass die beiden C++ Bibliotheken miteinander nicht kompatibel sind, so dass Sie würde um irgendwelche Abhängigkeiten gegen libc++ neu aufzubauen, wenn Sie das benutzen würden.

+1

Der zweite ist nicht für GCC-Kompatibilität. GCC hat auch einen strikten 'C++ 11'-Modus. 'gnu ++ 11' ist zum Aktivieren einiger GNU-Erweiterungen, die für wahrscheinlich internen Code und sicherlich glibc benötigt werden (das wäre wahrscheinlich" gnu90 "oder" gnu99 "). – rubenvb

+0

Danke @rubenvb - geklärt. – birryree

+0

Die Befehlszeilenoption '-std' aktiviert nicht die Funktionen, nach denen der Fragesteller fragt, weil sie noch nicht vom Clang unterstützt werden. –

0

Die Seite bei http://clang.llvm.org/cxx_status.html ist bestenfalls verwirrend. Zur Zeit unterstützt die Version 3.1 keine Initialisierungslisten oder Lambdas (ich habe also vorerst auf GCC 4.8 umgestellt).

Sie können jederzeit überprüfen Klirren Unterstützung für Funktionen, um die __has__feature Makro, gemäß den Anweisungen hier:

http://clang.llvm.org/docs/LanguageExtensions.html#checking_language_features

Zum Beispiel __has_feature(cxx_generalized_initializers) oder __has_feature(cxx_lambdas) wahr zurück, wenn diese Funktionen verfügbar und aktiviert sind.

Persönlich erwarte ich, dass diese Funktionen von clang 4.0 bereit sein, die voraussichtlich mit dem nächsten Xcode (wahrscheinlich Juni 2012) veröffentlicht werden.

- Herausgegeben, um die Versionen zu klären, die ich getestet habe - klar, Clang Versioning ist komplexer, als ich es realisiert hatte.

+0

Probieren Sie clang ++ -std = C++ 11 on2.9 oder so weiter. Sie haben gute Sachen. – emsr

+1

Die Fragen betrafen insbesondere Initialisierungslisten und Lambda-Ausdrücke. clang 2.9 unterstützt diese Funktionen nicht. –

+2

Initialisierungslisten und Lambdas werden beide von clang 3.1 unterstützt und werden seit einiger Zeit von der obersten Leitung unterstützt. Auch die Statusseite ist und ist seit einiger Zeit recht aktuell. – bames53