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
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:
À 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
:
__cplusplus
est 1
.__cplusplus
est 19971L
.__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).
À 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.
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.
Après un rapide google :
__STDC__
et __STDC_VERSION__
, voir ici
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.