descargar - ¿Cuál es el valor de__cplusplus para C++ 17?
c++17 descargar (3)
¿Cuál es el valor de
__cplusplus
cuando se usa C ++ 17?
De acuerdo con el borrador de la norma N4594 §16.8 / p1 Nombres de macro predefinidos [cpp.predefined] ( Emphasis Mine ):
La implementación debe definir los siguientes nombres de macro:
__cplusplus
El nombre__cplusplus
se define con el valor 201402L cuando se compila una unidad de traducción C ++. 156156) Se pretende que las versiones futuras de este estándar reemplacen el valor de esta macro con un valor mayor. Los compiladores no conformes deben usar un valor con un máximo de cinco dígitos decimales.
Sin embargo, se designa el mismo valor para el estándar C ++ 14. Aparentemente parece que no hay un valor oficial / estándar de __cplusplus
aún para el estándar C ++ 17.
En las versiones 6.1 y 7.0 de GCC, el valor se cambia a 201500
En la versión 3.8 y 3.9 de Clang, el valor no se modifica en 201406 .
En consecuencia, tendrá que esperar un poco para que salga el valor estándar.
--- Actualización ---
De acuerdo con el estándar de C ++ §19.8 / p1 Nombres de macro predefinidos [cpp.predefined] ( Énfasis en la mina ):
1 Los siguientes nombres de macro serán definidos por la implementación:
__cplusplus
El entero entero 201703L .
Por lo tanto, el valor de __cplusplus
cuando se usa C ++ 17 será 201703L .
Estamos tratando de probar algunos códigos bajo C ++ 17 y su cambio a std::uncaught_exception
. Parece que no consigo que GCC proporcione el valor de __cplusplus
:
$ /opt/local/bin/g++ -std=c++17 -dM -E - </dev/null | grep __cplusplus
cc1: warning: command line option ''-std=c++1z'' is valid for C++/ObjC++ but not for C
$
Y:
$ /opt/local/bin/g++ --version
g++-mp-6 (MacPorts gcc6 6.1.0_0) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
¿Cuál es el valor de __cplusplus
cuando se usa C ++ 17?
Realmente no sé por qué __cplusplus
no aparece como una macro regular, pero supongo que es así que no puedes redefinirlo. Así es como determino su valor.
#include <iostream>
int main( int argc, char** argv )
{
std::cout << __cplusplus << std::endl;
return 0;
}
Luego la compilación muestra el valor.
$ g++-6 test.cpp && ./a.out
201402
$ g++-6 -std=c++17 test.cpp && ./a.out
201500
Verificaría si es >= 201500
en lugar de verificar cualquier valor específico.
lo intentaré
#if __cplusplus > 201402L
// C__17 code here
...
#endif
En otras palabras, las pruebas para C ++ 14 deberían funcionar a medida que los compiladores agregan más características. Como alguien mencionado anteriormente, gcc usa 201500L. Parece que clang usa 201406L (cuatro meses después de C ++ 14, supongo).
El uso de lo anterior debe ser multiplataforma y funcionará incluso cuando C ++ 17 tenga un valor real para __cplusplus. Para más detalles acerca de las características en evolución, pruebe las macros de prueba de características .