Comment déterminer la version du standard C ++ utilisé par le compilateur?

Comment déterminez-vous quelle version du standard C ++ est implémentée par votre compilateur? Pour autant que je sache, voici les normes que j’ai connues:

  • C ++ 03
  • C ++ 98

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

 /*Define Microsoft Visual C++ .NET (32-bit) comstackr */ #if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300) ... #endif /*Define Borland 5.0 C++ (16-bit) comstackr */ #if defined(__BORLANDC__) && !defined(__WIN32__) ... #endif 

Vous devrez probablement le faire vous-même pour tous les compilateurs que vous utilisez.

De la FAQ Bjarne Stroustrup C ++ 0x :

__cplusplus

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

Bien que ce ne soit pas aussi utile qu’on le souhaiterait. gcc (apparemment depuis près de 10 ans) avait cette valeur fixée à 1 , ce qui excluait un compilateur principal, jusqu’à ce qu’il soit corrigé lorsque gcc 4.7.0 est sorti .

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

  • C ++ pre-C ++ 98: __cplusplus est 1 .
  • C ++ 98: __cplusplus est 199711L .
  • C ++ 98 + TR1: Ceci se lit comme C ++ 98 et il n’y a aucun moyen de vérifier que je connais.
  • C ++ 11: __cplusplus est 201103L .
  • C ++ 14: __cplusplus est 201402L .
  • C ++ 17: __cplusplus est 201703L .

Si le compilateur peut être un ancien gcc , nous devons recourir au piratage spécifique au compilateur (regardez une macro de version, comparez-le à une table avec des fonctionnalités implémentées) ou utilisez Boost.Config (qui fournit des macros pertinentes ). L’avantage de ceci est que nous pouvons en fait sélectionner des fonctionnalités spécifiques de la nouvelle norme et rédiger une solution de contournement si la fonctionnalité est manquante. Cela est souvent préférable à une solution de 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 une masortingce complète pour la prise en charge du compilateur des fonctionnalités C ++ 0x (si vous osez vérifier les fonctionnalités vous-même).

Malheureusement, une vérification 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 compilation de votre application (exécutez le code avec la fonctionnalité, vérifiez si elle a compilé et produit des résultats corrects) outil de choix si vous prenez cette route).

Selon ce que vous voulez réaliser, Boost.Config peut vous aider. Il ne fournit pas de détection de la version standard, mais fournit des macros qui vous permettent de vérifier la prise en charge de fonctionnalités spécifiques du langage / compilateur.

Après un rapide google :

__STDC__ et __STDC_VERSION__ , voir ici

__cplusplus

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

FAQ C ++ 0x par BS

Veuillez exécuter le code suivant pour vérifier la version.

 #include int main() { 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"; }