Comment vérifier la prise en charge de C ++ 11?

Existe-t-il un moyen de détecter à la compilation si le compilateur prend en charge certaines fonctionnalités de C ++ 11? Par exemple, quelque chose comme ceci:

#ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your comstackr doesn't support variadic templates. :(" #else template  class Tuple { // ... } #endif 

Boost.Config dispose d’ une pléthore de macros pouvant être utilisées pour tester la prise en charge de fonctionnalités C ++ 11 spécifiques.

Il existe une constante nommée __cplusplus que les compilateurs C ++ doivent définir sur la version du standard C ++ prise en charge.

 #if __cplusplus <= 199711L #error This library needs at least a C++11 compliant compiler #endif 

Il est défini sur 199711L dans Visual Studio 2010 SP1, mais je ne sais pas si les fournisseurs seront si audacieux pour l'augmenter déjà s'ils disposent uniquement d'un support (partiel) au niveau du compilateur par rapport à une bibliothèque C ++ standard avec toutes les modifications C ++ 11. .

Par conséquent, les définitions de Boost mentionnées dans une autre réponse restnt la seule façon sensée de déterminer, par exemple, s'il existe une prise en charge des threads C ++ 11 et d'autres parties spécifiques du standard.

Comme indiqué par la norme C ++ 11 (§iso.16.8):

Le nom __cplusplus est défini sur la valeur 201103L lors de la compilation d’une unité de traduction C ++.

Avec la valeur de cette macro, vous pouvez vérifier si le compilateur est compatible C ++ 11.

Maintenant, si vous cherchez un moyen standard de vérifier si le compilateur prend en charge un sous-ensemble de fonctionnalités C ++ 11, je pense qu’il n’y a pas de méthode standard et portable; Vous pouvez vérifier la documentation des compilateurs ou les fichiers d’en-tête de la bibliothèque std pour obtenir plus d’informations.

Je sais que c’est une très vieille question, mais cette question peut être souvent vue et les réponses sont un peu dépassées.

Les compilateurs plus récents avec la norme C ++ 14 ont un moyen standard de vérifier les fonctionnalités, y compris les fonctionnalités C ++ 11. Une page complète est disponible à l’ adresse https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations

En résumé, chaque fonctionnalité a une macro standard définie que vous pouvez vérifier avec #ifdef . Par exemple, pour vérifier les littéraux définis par l’utilisateur, vous pouvez utiliser

 #ifdef __cpp_user_defined_literals 

Pour vérification, supportez C ++ 14 et autres. Tests sur GCC 5.2.1.

 #include  int main(){ #if __cplusplus==201402L std::cout << "C++14" << std::endl; #elif __cplusplus==201103L std::cout << "C++11" << std::endl; #else std::cout << "C++" << std::endl; #endif return 0; } 

Je viens d’écrire une petite suite de tests pour vérifier quelles fonctionnalités C ++ 11 sont supscopes par un compilateur spécifique. Cependant, il s’agit bien sûr d’une vérification préalable à la compilation.

https://github.com/sloede/cxx11tests

Vous pouvez utiliser ceci:

 #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900) cout << "C++11 is supported"; #else cout << "C++11 is not supported"; #endif 

Pour C ++ 11, la plupart des compilateurs, à l'exception de Visual Studio, définissent la macro __cplusplus sur 201103L , mais toute version de Visual Studio la définit sur 199711L valeur utilisée par les autres compilateurs avant C ++ 11. Ce code compare la macro _cplusplus avec 201103L pour tous les compilateurs à l'exception de Visual Studio, et si le compilateur est Visual Studio, il vérifie si la version de Visual Studio est postérieure à 2015, la première version de Visual Studio qui supporte complètement C ++ 11 ( pour Visual Studio 2015, la macro _MSC_VER a la valeur 1900 , voir cette réponse ).

Si vous ne souhaitez pas utiliser Boost.Config et devez tester les compilateurs qui prennent en charge C ++ 11, vérifiez la valeur de la constante que __cplusplus fera. Cependant, un compilateur peut prendre en charge la plupart des fonctionnalités courantes du standard C ++ 11, mais il ne prend pas en charge l’intégralité des spécifications. Si vous souhaitez activer la prise en charge de compilateurs Visual Studio spécifiques qui ne sont pas encore conformes à 100% aux spécifications C ++ 11, utilisez l’extrait de code suivant qui permet la compilation dans Visual Studio 2013:

 #if defined(_MSC_VER) # if _MSC_VER < 1800 # error This project needs atleast Visual Studio 2013 # endif #elif __cplusplus <= 199711L # error This project can only be compiled with a compiler that supports C++11 #endif 

Une liste complète des versions du compilateur pour Visual Studio est fournie à la section Comment détecter si je comstack du code avec Visual Studio 2008

Dans le monde Linux / Unix traditionnel, autoconf est traditionnellement utilisé pour tester la présence de bibliothèques, de fonctionnalités du compilateur et de bogues les plaçant dans un fichier config.h que vous utilisez dans vos fichiers selon vos besoins.

Lorsque vous vérifiez la disponibilité d’une bibliothèque C ++ 11 (et non une fonctionnalité de langage), par exemple l’en-tête , vous pouvez #if __has_include() .

Parfois, la vérification de #if __cplusplus >= 201103L vous indique que vous utilisez C ++ 11, mais les nouveaux parameters tels que le paramètre de version de bibliothèque standard dans Xcode ne disposent toujours pas des nouvelles bibliothèques (la plupart sont disponibles sous des noms différents, à savoir )

Si vous rencontrez un problème avec certaines fonctionnalités de Visual Studio C ++, dans Visual Studio , vous définissez la norme de langage C ++ dans les propriétés du projet: Propriétés de configuration -> C \ C ++ -> Langue: entrer la description de l'image ici

Pour d’autres “certaines fonctionnalités”, vous pouvez activer les modules expérimentaux d’une ligne ci-dessous.