2012-05-15 16 views
22

Desde el sitio web de estado de soporte de C++ 11 de clang, http://clang.llvm.org/cxx_status.html, dice, "Lista de inicializador" y "Expresión de Lambda" son compatibles a partir de la versión 3.1.Estado de soporte de Clang 3.1 y C++ 11

Sin embargo, al usar el tronco LLVM/Clang (3.2), la compilación contra la lista de inicializadores y la expresión lambda generará mensajes de error.

¿Alguien sabe si Clang> 3.1 es compatible con esas características?

+0

posible duplicado de [¿Cómo puedo usar las características de C++ 11 en Clang?] (Http://stackoverflow.com/questions/10408849/how-can-i-use-c-11-features-in-clang) –

Respuesta

29

De manera predeterminada, clang++ no habilitará las características de C++ 11 - tiene to pass an additional flag during compilation.

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

O

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

Además, puede cambiar entre el uso de libstdc++ y Clang la propia libc++, que son diferentes implementaciones de la biblioteca estándar de C++. libc++ en algunos casos podría tener una mejor implementación del estándar C++ 11 que su biblioteca existente libstdc++.

# 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] 

Esto último es importante si está usando Clang en un entorno con una versión obsoleta de libstdc++ (como Mac OS X), pero tenga en cuenta que las dos bibliotecas de C++ no son compatibles entre sí, por lo que tendría para reconstruir cualquier dependencia contra libc++ si tuviera que usar eso.

+1

El segundo no es para compatibilidad GCC. GCC también tiene un estricto modo 'C++ 11'. 'gnu ++ 11' es para habilitar algunas extensiones de GNU necesarias para el código interno probablemente y sin duda glibc (que sería' gnu90' o 'gnu99' probablemente). – rubenvb

+0

Gracias @rubenvb - aclarado. – birryree

+0

El uso del modificador de línea de comando '-std' no habilitará las funciones sobre las que el interrogador está preguntando porque todavía no son compatibles con clang. –

0

La página en http://clang.llvm.org/cxx_status.html es confusa en el mejor de los casos. Actualmente, la versión 3.1 lanzada no es compatible con las listas de inicializadores o lambdas (por lo que he cambiado de nuevo a GCC 4.8 por el momento).

Siempre puede comprobar el apoyo tañido de funciones utilizando la macro __has__feature, de acuerdo con las instrucciones aquí:

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

Por ejemplo, __has_feature(cxx_generalized_initializers)__has_feature(cxx_lambdas) o devolverá true si esas características están disponibles y habilitados.

Personalmente, estoy esperando que esas características estén listas por clang 4.0, que se espera que se lance con el próximo Xcode (probablemente en junio de 2012).

- Editado para aclarar las versiones que he estado probando - claramente, las versiones de clang son más complejas de lo que me había dado cuenta.

+0

Pruebe clang ++ -std = C++ 11 on2.9 o más en adelante. Ellos tienen cosas buenas. – emsr

+1

Las preguntas eran específicamente sobre listas de inicializadores y expresiones lambda. clang 2.9 no es compatible con esas características. –

+2

Las listas de inicializadores y lambdas son soportadas por clang 3.1, y han sido soportadas por la parte superior del tronco desde hace algún tiempo. También la página de estado está y se ha mantenido bastante actualizada durante bastante tiempo. – bames53

Cuestiones relacionadas