telepatia sentir pueden psiquica psicologia mismo mellizos los hermanos gemelos extrasensorial entre conexion casos c++ c++11

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



hermanos mellizos psicologia (10)

¿Hay alguna forma de detectar en tiempo de compilación si el compilador 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 <typename... DatatypeList> class Tuple { // ... } #endif


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

https://github.com/sloede/cxx11tests


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

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

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

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


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

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. <tr1/array> )


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


Hay una constante llamada __cplusplus que los compiladores 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 aumentarlo si solo tienen soporte de nivel de compilador (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.


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

#include <iostream> 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; }


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 compiladores, 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 compiladores antes de C ++ 11. Este código compara la macro _cplusplus con 201103L para todos los compiladores excepto Visual Studio, y si el compilador 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 ).


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

Los compiladores 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


Si no quiere usar Boost.Config y necesita probar compiladores que admitan C ++ 11, entonces comprobar el valor de la constante __cplusplus servirá. Sin embargo, un compilador 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 compiladores 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 compilar 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 compilador para Visual Studio en Cómo detectar si estoy compilando código con Visual Studio 2008