¿Cómo determinar la versión del estándar C ++ utilizado por el comstackdor?

¿Cómo se determina qué versión del estándar de C ++ implementa su comstackdor? Por lo que sé, a continuación están los estándares que he conocido:

  • C ++ 03
  • C ++ 98

Por lo que sé, no hay una forma general de hacerlo. Si nos fijamos en los encabezados de las bibliotecas de soporte multiplataforma / comstackdor múltiple siempre encontrará una gran cantidad de definiciones que utilizan construcciones específicas del comstackdor para determinar tales cosas:

 /*Define Microsoft Visual C++ .NET (32-bit) compiler */ #if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300) ... #endif /*Define Borland 5.0 C++ (16-bit) compiler */ #if defined(__BORLANDC__) && !defined(__WIN32__) ... #endif 

Probablemente tendrá que hacer eso se define a sí mismo para todos los comstackdores que utiliza.

De las preguntas frecuentes de Bjarne Stroustrup C ++ 0x :

__cplusplus

En C ++ 0x, la macro __cplusplus se establecerá en un valor que difiere de (es mayor que) el 199711L actual.

Aunque esto no es tan útil como a uno le gustaría. gcc (aparentemente durante casi 10 años) tenía este valor establecido en 1 , descartando un comstackdor principal, hasta que se solucionó cuando salió gcc 4.7.0 .

Estos son los estándares de C ++ y qué valor debe esperar en __cplusplus :

  • C ++ pre-C ++ 98: __cplusplus es 1 .
  • C ++ 98: __cplusplus es 199711L .
  • C ++ 98 + TR1: Esto se lee como C ++ 98 y no hay forma de verificar que yo sepa.
  • C ++ 11: __cplusplus es 201103L .
  • C ++ 14: __cplusplus es 201402L .
  • C ++ 17: __cplusplus es 201703L .

Si el comstackdor puede ser un gcc más antiguo, tenemos que recurrir a hackers específicos del comstackdor (mire una macro de versión, compárela con una tabla con características implementadas) o use Boost.Config (que proporciona macros relevantes ). La ventaja de esto es que en realidad podemos elegir características específicas del nuevo estándar y escribir una solución alternativa si falta la función. Esto a menudo es preferible a una solución mayorista, ya que algunos comstackdores pretenden implementar C ++ 11, pero solo ofrecen un subconjunto de las características.

Stdcxx Wiki alberga una matriz completa para el soporte del comstackdor de las características de C ++ 0x (si te atreves a verificar las características por ti mismo).

Desafortunadamente, un control más detallado de las funciones (por ejemplo, funciones de biblioteca individuales como std::copy_if ) solo se puede hacer en el sistema de comstackción de la aplicación (ejecutar código con la función, verificar si se compiló y producir resultados correctos – autoconf es el herramienta de elección si toma esta ruta).

Dependiendo de lo que desee lograr, Boost.Config podría ayudarlo. No proporciona detección de la versión estándar, pero proporciona macros que le permiten verificar el soporte de características específicas del lenguaje / comstackdor.

Después de un google rápido :

__STDC__ y __STDC_VERSION__ , mira aquí

__cplusplus

En C ++ 0x, la macro __cplusplus se establecerá en un valor que difiere de (es mayor que) el 199711L actual.

C ++ 0x Preguntas frecuentes por BS

Por favor, ejecute el siguiente código para verificar la versión.

 #include int main() { if (__cplusplus == 201402L) std::cout << "C++14\n"; else if (__cplusplus == 201103L) std::cout << "C++11\n"; else if (__cplusplus == 199711L) std::cout << "C++98\n"; else std::cout << "pre-standard C++\n"; }