1 votes

Comment vérifier la prise en charge de C++20? Quelle est la valeur de __cplusplus pour C++20?

Lié aux questions Comment vérifier la prise en charge de C++11? et Quelle est la valeur de __cplusplus pour C++17?

Comment puis-je savoir si le compilateur peut gérer / est configuré pour utiliser C++20? Je sais qu'il est, en principe, possible de vérifier la version de C++ en utilisant :

#if __cplusplus > ???
  // Code C++20 ici
#endif

Que devrait être ??? pour C++20?

42voto

gsamaras Points 9567

Il est trop tôt pour ça.

Jusqu'à ce que la norme le remplace, utilisez :

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

car la macro prédéfinie de C++20 va être plus grande que celle de C++17.

Comme le mentionne la réponse de @SombreroChicken, [cpp.predefined] (1.1) spécifie (emphasis mine):

__cplusplus

La littérale entière 201703L. [Remarque : Il est prévu que les futures versions de cette norme internationale remplaceront la valeur de cette macro par une valeur supérieure.]


Les macros utilisées, en novembre 2018, sont :


PS : Si vous êtes intéressé par des fonctionnalités spécifiques, alors [cpp.predefined] (1.8) définit les macros correspondantes que vous pourriez utiliser. Remarquez cependant qu'ils pourraient changer à l'avenir.

30voto

Acorn Points 6838

La valeur pour C++20 est 202002L, comme vous pouvez le voir à [cpp.predefined]p1.1:

_­_­cplusplus

La littérale entière 202002L. [ Note: Il est prévu que les futures versions de cette Norme internationale remplaceront la valeur de cette macro par une valeur supérieure. — note de fin ]

Par conséquent, pour les compilateurs qui implémentent déjà la nouvelle norme, vous pouvez vérifier en utilisant :

#if __cplusplus >= 202002L
    // Code C++20 (et plus récent)
#endif

Voici le support du compilateur jusqu'à présent:

  • Clang >= 10
  • GCC >= 11
  • ICX >= 2021
  • ICC: Non (la version >= 2021 définit 202000L; notez le 0).
  • MSVC: Non (jusqu'à la version 19.28, notez qu'il nécessitera /Zc:__cplusplus).

Pour ceux qui ne l'implémentent pas encore, vous pouvez plutôt utiliser :

#if __cplusplus > 201703L
    // Code C++20 (et plus récent)
#endif

Étant donné que tous les compilateurs la définissent déjà plus haut que le 201703L de C++17 dans leur mode "C++ le plus récent" respectif.

7voto

Gill Bates Points 3884

Il n'y a pas encore de version connue de __cplusplus car C++20 est encore en développement. Il n'y a que des brouillons pour C++20.

Le dernier brouillon N4788 contient encore :

__cplusplus

La littérale entière 201703L. [Note : Il est prévu que les versions futures de cette Norme internationale remplaceront la valeur de cette macro par une valeur plus grande. —note de fin]

En ce qui concerne la vérification, je suivrais la réponse de @gsamaras.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X