224 votes

Comment déterminer la version de la norme C ++ utilisée par le compilateur?

Comment déterminez-vous quelle version de la norme C ++ est implémentée par votre compilateur? À ma connaissance, voici les normes que j'ai connues:

  • C ++ 03
  • C ++ 98

386voto

pmr Points 30450

À partir de la Bjarne Stroustrup C++0x FAQ:

__cplusplus

Dans C++0x la macro __cplusplus sera réglé à une valeur autre que celle à partir de (supérieur) de l'actuel 199711L.

Bien que ce n'est pas aussi utile que l'on voudrait. gcc (apparemment depuis près de 10 ans) cette valeur est définie à l' 1 ce qui exclut l'un des principaux compilateur. Heureusement, il sera fixé une fois gcc 4.7.0 sort.

Ce sont les normes C++ et quelle est la valeur que vous devriez être en mesure de s'attendre en __cplusplus:

  • C++ pré-C++98: __cplusplus est 1.
  • C++98: __cplusplus est 19971L.
  • C++98 + TR1: Cela se lit comme C++98 et il n'y a aucun moyen de vérifier ce que je sache.
  • C++0x/11: __cplusplus est 201103L.

Mais, en raison de la situation actuelle en gcc nous avons besoin de recourir à compilateur spécifique hackery (regardez une version de la macro, de la comparer à une table avec des fonctionnalités implémentées) ou utiliser Boost.Config (les macros). L'avantage, c'est que nous pouvons choisir les caractéristiques spécifiques de la nouvelle norme et écrire une solution de contournement si la fonction est manquante. C'est souvent préférée à une solution de gros, comme certains compilateurs demande de mettre en œuvre C++11, mais offrent seulement un sous-ensemble des fonctionnalités.

La plus complète de la matrice de prise en charge du compilateur de C++0x caractéristiques peuvent être trouvés ici (si vous l'osez pour vérifier les fonctionnalités de vous-même).

Malheureusement plus finement grainé vérification de caractéristiques (par exemple, la bibliothèque de fonctions comme std::copy_if) ne peut être fait que dans le système de compilation de votre application (exécuter du code avec la fonction, vérifier si elle a établi et a produit des résultats corrects).

17voto

RED SOFT ADAIR Points 5762

À ma connaissance, il n’existe aucun moyen général de le faire. Si vous regardez les en-têtes des bibliothèques prenant en charge plusieurs compilateurs multi-plateformes / compilateurs, vous trouverez toujours beaucoup de définitions qui utilisent des constructions spécifiques au compilateur pour déterminer de telles choses:

 /*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
     ...
#endif

/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
     ...
#endif
 

Vous devrez probablement faire de telles définitions pour tous les compilateurs que vous utilisez.

9voto

Björn Pollex Points 41424

En fonction de vos objectifs, Boost.Config peut vous aider. Il ne détecte pas la version standard, mais fournit des macros permettant de vérifier la prise en charge de fonctionnalités de langage / compilateur spécifiques.

6voto

Vinzenz Points 1949

__cplusplus

Dans C ++0x, la macro __cplusplus sera définie sur une valeur différente de (est supérieure à) la valeur 199711L actuelle.

FAQ C ++0x par BS

0voto

Tor Valamo Points 14209

Après un rapide google :

__STDC__ et __STDC_VERSION__ , voir ici

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