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:
À 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.
À 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'actuelle199711L
.
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
:
__cplusplus
Est 1
.__cplusplus
Est 199711L
.__cplusplus
Est 201103L
.__cplusplus
Est 201402L
.__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).
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";
}
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.
__cplusplus
Dans C++ 0x, la macro __cplusplus sera définie sur une valeur différente de (est supérieure à) la valeur 199711L actuelle.
Après un google rapide :
__STDC__
et __STDC_VERSION__
, voir ici