stroustrup site official current c++ macros c++20

site - ¿Cómo compruebo la compatibilidad con C++ 20? ¿Cuál es el valor de__cplusplus para C++ 20?



current c++ (3)

Relacionado con las preguntas ¿Cómo compruebo la compatibilidad con C ++ 11? y ¿Cuál es el valor de __cplusplus para C ++ 17?

¿Cómo puedo preguntar si el compilador puede manejar / está configurado para usar C ++ 20? Sé que, en principio, es posible consultar la versión de C ++ de la siguiente manera:

#if __cplusplus > ??? // C++20 code here #endif

¿Qué debería ??? ¿Ser para C ++ 20?


El nuevo valor estará disponible en algún momento en [cpp.predefined] p1.1 :

__cplusplus

El literal entero 201703L . [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor. - nota final]

Los valores actuales utilizados en los compiladores principales son, a partir de 2018-11-30:

Ya que todos ellos ya son más altos que los 201703L de C ++ 17, ya puedes usar:

#if __cplusplus > 201703L // C++20 code #endif


Es muy temprano para eso.

Hasta que el estándar lo reemplace, use:

#if __cplusplus > 201703L // C++20 code #endif

ya que la macro predefinida de C ++ 20 va a ser más grande que la de C ++ 17.

Como menciona la respuesta de @ SombreroChicken, [cpp.predefined] (1.1) especifica (el énfasis es mío):

__cplusplus

El literal entero 201703L . [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor .]

Las macros utilizadas, a partir de noviembre de 2018, son:

  • GCC 9.0.0: 201709L para C ++ 2a. Demo en vivo
  • Clang 8.0.0: 201707L . Demo en vivo
  • VC ++ 15.9.3: 201704L (como menciona la respuesta de @ Acorn).

PD: Si está interesado en características específicas, entonces [cpp.predefined] (1.8) define las macros correspondientes, que podría usar. Tenga en cuenta, sin embargo, que podrían cambiar en el futuro.


__cplusplus no se conoce la versión __cplusplus porque C ++ 20 aún está en desarrollo. Solo hay borradores para C ++ 20.

El último borrador del N4788 todavía contiene:

__cplusplus

El literal entero 201703L . [Nota: se pretende que las versiones futuras de esta Norma Internacional reemplacen el valor de esta macro con un valor mayor. "Nota final"

En cuanto a comprobarlo, usaría la respuesta de @gsamaras.