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:
À 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 à) la199711L
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
:
__cplusplus
est 1
. __cplusplus
est 199711L
. __cplusplus
est 201103L
. __cplusplus
est 201402L
. __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"; }