¿Hay alguna forma de detectar en tiempo de compilación si el compilador es compatible con 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
template <typename... Test> struct compiler_must_support_variadic_templates;
. Un error de sintaxis revelaría rápidamente el problema. (Solo como acotación al margen, un mensaje de error adecuado es mucho mejor.)Respuestas:
Hay una constante denominada
__cplusplus
que los compiladores de C ++ deben establecer en la versión del estándar C ++ compatible; consulte estoEstá configurado en 199711L en Visual Studio 2010 SP1, pero no sé si los proveedores serán tan audaces para aumentarlo ya si solo tienen soporte (parcial) a nivel de compilador en comparación con una biblioteca C ++ estándar con todos los cambios de C ++ 11 .
Por lo tanto, las definiciones de Boost mencionadas en otra respuesta siguen siendo la única forma sensata de averiguar si hay, por ejemplo, soporte para subprocesos C ++ 11 y otras partes específicas del estándar.
fuente
__cplusplus
en201103L
. Eso afirma la plena conformidad con el estándar de 2011; no le informa acerca de la conformidad parcial o las extensiones del compilador. Si__cplusplus
se establece en201103L
, entonces el compilador se ajusta completamente o te está mintiendo. Si no es así, no se puede saber qué funciones admite.-std=c++11
se especifica la opción (puede que también con-std=gnu++11
). Lo hacen, aunque no están del todo completas en funciones (4.8 nos acerca mucho más). Nota: existe una brecha entre lo que admite el compilador y lo que está disponible en la biblioteca estándar. Tanto 4.7.xy 4.8.x carecen actualmente de compatibilidad con expresiones regulares, pero esa es una biblioteca, no una característica del compilador.__cplusplus
to199711L
para C ++ 11.__cplusplus
en199711L
no es un compilador conforme a C ++ 11. Probablemente tengan opciones para que se comporten correctamente.Según lo establecido por el estándar C ++ 11 (§iso.16.8):
Con el valor de esa macro, puede verificar si el compilador es compatible con C ++ 11.
Ahora, si está buscando una forma estándar de verificar si el compilador admite un subconjunto de características 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.
fuente
Sé que esta es una pregunta muy antigua, pero es posible que se vea con frecuencia 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 verificar características, incluidas las características de C ++ 11. Hay una página completa en https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
En resumen, cada función tiene una macro estándar definida con la que puede verificar
#ifdef
. Por ejemplo, para comprobar los literales definidos por el usuario, puede utilizarfuente
__has_include()
macro.Para comprobar el soporte C ++ 14 y otros. Pruebas en GCC 5.2.1.
fuente
Puedes usar esto:
Para C ++ 11, la mayoría de los compiladores, excepto Visual Studio, establecen la
__cplusplus
macro en201103L
, 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_cplusplus
macro con201103L
todos los compiladores excepto Visual Studio, y si el compilador es Visual Studio, verifica si la versión de Visual Studio es posterior a 2015, la primera versión de Visual Studio que es completamente compatible con C ++ 11 (para Visual Studio 2015, la_MSC_VER
macro tiene el valor1900
, consulte esta respuesta ).fuente
g++ -std=c++98
con GCC 4.8, imprime incorrectamenteC++11 is supported
.Si no desea utilizar Boost.Config y necesita probar compiladores que admitan C ++ 11, entonces comprobar el valor de la constante
__cplusplus
será suficiente. Sin embargo, un compilador puede admitir la mayoría de las funciones populares del estándar C ++ 11, pero no admite todas las especificaciones. Si desea habilitar la compatibilidad con compiladores de Visual Studio específicos que aún no cumplen al 100% con las especificaciones de C ++ 11, utilice el siguiente fragmento de código que permite compilar en Visual Studio 2013: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
fuente
En el mundo tradicional de Linux / Unix, autoconf se usa tradicionalmente para probar la presencia de bibliotecas y características del compilador y errores colocándolos en un config.h que usa en sus archivos según sea necesario.
fuente
Cuando su cheque es para la disponibilidad de una biblioteca de C ++ 11 (no una característica de idioma), por ejemplo, el
<array>
encabezado, puede#if __has_include(<array>)
.A veces, la verificación
#if __cplusplus >= 201103L
le indicaría que usa C ++ 11, pero es posible que otras configuraciones como la configuración de la versión de biblioteca estándar en Xcode aún no tengan las nuevas bibliotecas disponibles (la mayoría de ellas están disponibles con diferentes nombres, es decir<tr1/array>
)fuente