web-dev-qa-db-fra.com

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
91
jasonline

À 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 des 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.

9
RED SOFT ADAIR

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

__cplusplus

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

Bien que ce ne soit pas aussi utile que l'on voudrait. gcc (apparemment depuis près de 10 ans) avait cette valeur définie sur 1, excluant un compilateur majeur, jusqu'à ce que il a été corrigé lorsque gcc 4.7.0 est sorti .

Ce sont les normes C++ et la valeur à laquelle vous pouvez vous attendre dans __cplusplus:

  • C++ pré-C++ 98: __cplusplus Est 1.
  • C++ 98: __cplusplus Est 199711L.
  • C++ 98 + TR1: Cela se lit comme C++ 98 et il n'y a aucun moyen de vérifier que je sache.
  • C++ 11: __cplusplus Est 201103L.
  • C++ 14: __cplusplus Est 201402L.
  • C++ 17: __cplusplus Est 201703L.

Si le compilateur est peut-être un ancien gcc, nous devons recourir à un hackery spécifique au compilateur (regardez une macro de version, comparez-le à un tableau avec des fonctionnalités implémentées) ou utilisez Boost.Config (qui fournit macros pertinentes ). L'avantage de cela est que nous pouvons réellement choisir des fonctionnalités spécifiques de la nouvelle norme et écrire une solution de contournement si la fonctionnalité est manquante. Ceci est souvent préféré à une solution de vente en gros, car certains compilateurs prétendent implémenter C++ 11, mais n'offrent qu'un sous-ensemble des fonctionnalités.

Le wiki Stdcxx héberge un matrice complète pour la prise en charge par le compilateur des fonctionnalités C++ 0x (si vous osez vérifier les fonctionnalités vous-même).

Malheureusement, une recherche plus fine des fonctionnalités (par exemple, des fonctions de bibliothèque individuelles telles que std::copy_if) Ne peut être effectuée que dans le système de construction de votre application (code d'exécution avec la fonctionnalité, vérifiez si elle a été compilée et a produit les résultats corrects - autoconf est l'outil de choix si vous empruntez cette route).

205
pmr

S'il vous plaît, exécutez le code suivant pour vérifier la version.

#include<iostream>

int main() {
    if (__cplusplus == 201703L) std::cout << "C++17\n";
    else if (__cplusplus == 201402L) std::cout << "C++14\n";
    else if (__cplusplus == 201103L) std::cout << "C++11\n";
    else if (__cplusplus == 199711L) std::cout << "C++98\n";
    else std::cout << "pre-standard C++\n";
}
15
Deepanshu

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.

6
Björn Pollex

__cplusplus

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

C++ 0x FAQ par BS

3
Vinzenz

Après un google rapide :

__STDC__ et __STDC_VERSION__, voir ici

0
Tor Valamo