stroustrup descargar caracteristicas bjarne c++ macros c++17

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 ++. 156

156) 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

Demo en vivo

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 .