Existe-t-il une directive de préprocesseur pour détecter le support C ++ 11x?

Si vous avez du code où je voudrais utiliser les extensions C ++ 11x autant que possible, mais si elles ne sont pas sockets en charge Actuellement, la version OSX de GCC et le compilateur VisualC ont peu ou pas de support pour C ++ 11x, donc j’utilise:

#if (defined(__APPLE__) || (defined(_WIN32))) ...fallback code without C++11x ... #else ... code using C++11x ... #endif 

Et cela fonctionne, mais ce n’est pas vraiment la bonne chose à faire, d’autant plus que le compilateur gcc de MacPorts supporte c ++ 11x.

Existe-t-il une macro de type #define C11X_SUPPORTED ? Peut-être quelque chose que seul GCC a?

__cplusplus devrait être défini comme 199711L dans les compilateurs pré-C ++ 11, 201103L dans ceux supportant C ++ 11. Une autre question est de savoir si cela aide beaucoup: la plupart des compilateurs ne sont qu’à mi-chemin, donc ne devrait pas le définir comme 201103L , même s’ils supportent les fonctionnalités qui vous intéressent. Et il n’est pas rare qu’un compilateur ment: un compilateur qui le définit comme 199711L et ne supporte pas l’ export pour les modèles, par exemple. Mais il n’y a pas de fonctionnalité standard par test de fonctionnalité.

La solution la plus simple consiste simplement à ne pas utiliser de nouvelle fonctionnalité particulière avant d’être sûr que tous les compilateurs le prennent en charge. Vous devez quand même écrire et supporter le code de secours; pourquoi maintenir deux versions. La seule exception à cette règle pourrait être les nouvelles fonctionnalités ayant un impact sur les performances: le support du sémantique de déplacement ou non. Dans de tels cas, je suggérerais un fichier d’inclusion dépendant du compilateur, que vous écrivez vous-même en fonction de la documentation du compilateur et des tests personnels; Tout simplement parce que le compilateur peut documenter qu’il prend en charge une fonctionnalité spécifique ne signifie pas que son support est exempt de bogues. Il suffit de créer un répertoire par compilateur ciblé, d’y placer ce fichier et de spécifier l’option -I ou /I appropriée dans votre fichier makefile ou projet.

Et vos tests devraient ressembler à:

 #ifdef HAS_MOVE_SEMANTICS ... #endif 

plutôt que sur le compilateur, la version ou autre chose.

Vous pouvez vérifier la valeur de la macro __cplusplus . Pour C ++ 11, il est supérieur à 199711L .

Donc quelque chose comme

 #if __cplusplus > 199711L #endif 

La bibliothèque Boost.Config fournit des macros de préprocesseur granulaires que vous pouvez utiliser pour comstackr de manière conditionnelle en fonction de la présence d’une fonctionnalité C ++ 11 donnée.

(Pour un compilateur, la prise en charge de C ++ 11 ne doit pas nécessairement être totale. Par exemple, considérez la manière dont Microsoft a sélectionné les fonctionnalités C ++ 11 à inclure dans Visual Studio 2012 en fonction de leurs avantages. )