web-dev-qa-db-fra.com

Comment la directive __cplusplus est-elle définie dans divers compilateurs?

Mon compilateur l'étend à 199711LL. Qu'est-ce que ça veut dire? J'ai lu que __cplusplus> 199711L signifie C++ 11. Quelles sont les plus répandues de cette macro et que signifient-t-elle?

33
unj2

Le 1997111l signifie année = 1997, mois = 11 (c'est-à-dire novembre 1997) - la date à laquelle le Comité a approuvé la norme que le reste de l'ISO approuvé au début de 1998.

Pour la norme de 2003, il y avait peu de changements suffisants que le Comité (apparemment) a décidé de laisser cette valeur inchangée.

Pour la norme de 2011, il est nécessaire d'être défini comme 201103L, (encore une fois, année = 2011, mois = 03), ce qui signifie à nouveau que le Comité a approuvé la norme en finalisée en mars 2011.

Pour la norme de 2014, il est nécessaire d'être défini comme 201402L, interprété de la même manière que ci-dessus (février 2014).

Pour la norme de 2017, il est nécessaire d'être défini comme 201703L (mars 2017).

Avant que la norme d'origine ait été approuvée, de nombreux compilateurs le définisent normalement à 0 (ou juste une définition vide comme #define __cplusplus) Pour signifier "non-conformation". Lorsqu'on leur a demandé leur conformité la plus stricte, beaucoup l'ont définis à 1.

J'ai presque oublié de mentionner, mais une nouvelle riche des compilateurs antiques: quelques-unes des premières versions de CFRONT (et probablement quelques autres les copies) définies c_plusplus à la place de __cplusplus. Je ne me souviens pas qu'il soit défini à une valeur significative cependant.

42
Jerry Coffin

Je pense que le prétraiteur définit les différentes versions devraient entrer dans SD-6:

#define __cpp_1997 199711L
#define __cpp_2003 __cpp_1997
#define __cpp_2011 201103L
#define __cpp_2014 201402L
#define __cpp_2017 201703L

En regardant dans les années 2020, nous pourrions avoir trois autres normes. Je ne doute pas que de nombreux mises en œuvre disposent de normes de soutien du code à partir de 1997.

Pour que je voudrais une définition mnémonique, je ne devrais donc pas continuer à revenir à ce post.

5
emsr

Cela signifie qu'il est compatible avec la norme C++ de 1997 (en fait connue sous le nom de C++ 98, comme ils ont pris trop de temps pour la ratifier ..

3
Michael J

Afin de répondre au titre de la question, laissez-moi vous diriger vers une collection de compilateurs typiques. Si vous conservez vos drapeaux de compilation par défaut, les versions standard C++ suivantes seront choisies:

https://gist.github.com/ax3l/53db9fa8a4f4c21ecc5c4100c0d93C94

0
Ax3l