¿Cómo verifico si tengo compatibilidad con C ++ 11?

¿Hay alguna forma de detectar en tiempo de comstackción si el comstackdor admite ciertas características de C ++ 11? Por ejemplo, algo como esto:

#ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template  class Tuple { // ... } #endif 

Boost.Config tiene una gran cantidad de macros que se pueden utilizar para probar el soporte de funciones específicas de C ++ 11.

Hay una constante llamada __cplusplus que los comstackdores de C ++ deben establecer en la versión del estándar de C ++ compatible ver esto

 #if __cplusplus < = 199711L #error This library needs at least a C++11 compliant compiler #endif 

Está configurado en 199711L en Visual Studio 2010 SP1, pero no sé si los proveedores estarán tan audaces para boostlo si solo tienen soporte de nivel de comstackdor (parcial) frente a una biblioteca de C ++ estándar con todos los cambios de C ++ 11 .

Así que las definiciones de Boost mencionadas en otra respuesta siguen siendo la única manera sensata de averiguar si existe, por ejemplo, compatibilidad con hilos C ++ 11 y otras partes específicas del estándar.

Como se establece en el estándar C ++ 11 (§iso.16.8):

El nombre __cplusplus se define con el valor 201103L al comstackr una unidad de traducción C ++.

Con el valor de esa macro, puede verificar si el comstackdor cumple con C ++ 11.

Ahora bien, si está buscando una forma estándar para verificar si el comstackdor admite un subconjunto de C ++ 11, creo que no existe una forma estándar y portátil; puede consultar la documentación de los comstackdores o los archivos de encabezado de la biblioteca estándar para obtener más información.

Sé que esta es una pregunta muy antigua, pero esta pregunta a menudo se ve y las respuestas están un poco desactualizadas.

Los comstackdores más nuevos con el estándar C ++ 14 tienen una forma estándar de comprobar las características, incluidas las características de C ++ 11. Una página completa está en https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations

En resumen, cada característica tiene una macro estándar definida que puede verificar con #ifdef . Por ejemplo, para verificar los literales definidos por el usuario, puede usar

 #ifdef __cpp_user_defined_literals 

Para soporte de cheques C ++ 14 y otros. Prueba en GCC 5.2.1.

 #include  int main(){ #if __cplusplus==201402L std::cout < < "C++14" << std::endl; #elif __cplusplus==201103L std::cout << "C++11" << std::endl; #else std::cout << "C++" << std::endl; #endif return 0; } 

Acabo de escribir un pequeño conjunto de pruebas para comprobar qué características de C ++ 11 son compatibles con un comstackdor específico. Sin embargo, esto es, por supuesto, una verificación de “precomstackción”.

https://github.com/sloede/cxx11tests

Puedes usar esto:

 #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900) cout < < "C++11 is supported"; #else cout << "C++11 is not supported"; #endif 

Para C ++ 11, la mayoría de los comstackdores, excepto Visual Studio, establecieron la macro __cplusplus en 201103L , pero cualquier versión de Visual Studio la establece en 199711L que es el valor utilizado para otros comstackdores antes de C ++ 11. Este código compara la macro _cplusplus con 201103L para todos los comstackdores excepto Visual Studio, y si el comstackdor es Visual Studio, comprueba si la versión de Visual Studio es posterior a 2015, la primera versión de Visual Studio que admite completamente C ++ 11 ( para Visual Studio 2015, la macro _MSC_VER tiene el valor 1900 , ver esta respuesta ).

Si no quiere usar Boost.Config y necesita probar comstackdores que admitan C ++ 11, entonces comprobar el valor de la constante __cplusplus servirá. Sin embargo, un comstackdor podría soportar la mayoría de las características populares del estándar C ++ 11 pero no es compatible con todas las especificaciones. Si desea habilitar el soporte para comstackdores de Visual Studio específicos que aún no son 100% compatibles con las especificaciones de C ++ 11, utilice el siguiente fragmento de código que permite comstackr en Visual Studio 2013:

 #if defined(_MSC_VER) # if _MSC_VER < 1800 # error This project needs atleast Visual Studio 2013 # endif #elif __cplusplus <= 199711L # error This project can only be compiled with a compiler that supports C++11 #endif 

Se proporciona una lista completa de versiones del comstackdor para Visual Studio en Cómo detectar si estoy comstackndo código con Visual Studio 2008

En el mundo tradicional de Linux / Unix, autoconf se usa tradicionalmente para probar la presencia de bibliotecas y las características y compiler errors, colocándolos en una configuración que usted usa en sus archivos según sea necesario.

Cuando su cheque es para una disponibilidad de biblioteca de C ++ 11 (no una característica de idioma), por ejemplo, el encabezado , puede #if __has_include() .

A veces, al verificar #if __cplusplus >= 201103L se indica que usa C ++ 11, pero otras configuraciones como la configuración de la versión de biblioteca estándar en Xcode aún no tienen disponibles las nuevas bibliotecas (la mayoría están disponibles en diferentes nombres, por ej. )

En caso de que tenga un problema con ciertas características de Visual Studio C ++, en Visual Studio , configure el estándar de lenguaje C ++ en Propiedades del proyecto: Propiedades de configuración -> C \ C ++ -> Idioma: enter image description here

Para otras “características”, puede habilitar módulos experimentales en una línea a continuación.