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".
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
Boost.Config tiene una gran cantidad de macros que se pueden utilizar para probar el soporte de funciones específicas de C ++ 11.