web-dev-qa-db-fra.com

Comment vérifier le support C ++ 20? Quelle est la valeur de __cplusplus pour C ++ 20?

En lien avec les questions Comment vérifier le support 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 se renseigner sur la version C++ en:

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

Qu'est-ce que doit ??? être pour C++ 20?

27
user2296653

C'est trop tôt pour ça.

Jusqu'à ce que le standard le remplace, utilisez:

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

puisque la macro prédéfinie de C++ 20 sera plus grande que celle de C++ 17.

Comme le dit la réponse de @ SombreroChicken, [cpp.predefined] (1.1) spécifie (souligné par moi):

__cplusplus

Le littéral entier 201703L. [Remarque: il est prévu que les futures versions de la présente Norme internationale remplacent la valeur de cette macro par un valeur supérieure .]


Les macros utilisées, à compter de novembre 2018, sont les suivantes:

  • GCC 9.0.0: 201709L pour C++ 2a. Live demo
  • Clang 8.0.0: 201707L. Live demo
  • VC++ 15.9.3: 201704L _ (comme le mentionne la réponse de @ Acorn).

PS: Si des fonctionnalités spécifiques vous intéressent, alors [cpp.predefined] (1.8) définit les macros correspondantes, que vous pourriez utiliser. Notez cependant qu'ils pourraient changer dans le futur.

32
gsamaras

La nouvelle valeur sera disponible à un moment donné à [cpp.predefined] p1.1 :

_­_­cplusplus

Le littéral entier 201703L. [Remarque: il est prévu que les futures versions de la présente Norme internationale remplacent la valeur de cette macro par une valeur supérieure. - note de fin]

Les valeurs actuelles utilisées dans les principaux compilateurs sont, à compter du 2018-11-30:

Puisque tous sont déjà plus élevés que ceux de C++ 17, 201703L, vous pouvez déjà utiliser:

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

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

Le dernier projet N4788 contient toujours:

__cplusplus

Le littéral entier 201703L. [Remarque: il est prévu que les futures versions de la présente Norme internationale remplacent la valeur de cette macro par une valeur supérieure. —Fin note]

Pour le vérifier, j'utiliserais @gsamaras answer.

5
Sombrero Chicken