34 votes

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

Si vous avez un code dans lequel je voudrais utiliser autant que possible les extensions C ++ 11x, mais que je dispose d’un repli s’il n’est pas pris en charge. Actuellement, la version OSX de GCC et le compilateur VisualC ne prennent en charge que peu ou pas C ++ 11x. J'utilise donc:

 #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 que seul GCC a?

33voto

James Kanze Points 96599

__cplusplus devrait être défini comme 199711L en pré-C++11 compilateurs, 201103L dans ceux soutien de la collectivité C++11. Si c'est une grande aide dans la pratique c'est une autre question: la plupart des compilateurs sont seulement à mi-chemin, et donc ne devrait pas être le définissant comme 201103L, même s'ils prennent en charge les fonctionnalités qui vous intéressent. Et il n'est pas rare qu'un compilateur à mentir: un compilateur qui la définit en tant que 199711L et ne prend pas en charge export pour les modèles, par exemple. Mais il n'y a pas de norme fonction par fonction test.

La solution la plus simple est juste de ne pas utiliser toute nouvelle fonctionnalité jusqu'à ce que vous pouvez être sûr que tous les compilateurs en charge. Vous avez à écrire et à soutenir le secours de code de toute façon, pourquoi conserver les deux versions. La seule exception à cette règle peut être de nouvelles fonctionnalités qui ont un impact sur les performances: si le compilateur prend en charge la sémantique de déplacement ou non. Dans de tels cas, je vous suggère un compilateur dépendant d'inclure le fichier, ce qui vous écrivez vous-même basé sur la documentation du compilateur et des personnels des tests; tout simplement parce que le compilateur peut noter qu'il prend en charge une fonctionnalité spécifique ne signifie pas que son soutien est exempt de bogues. Il suffit de créer un répertoire par ciblée compilateur, mettre ce fichier là et préciser le -I ou /I option dans votre makefile ou un fichier de projet.

Et vos tests devrait être quelque chose le long des lignes de:

#ifdef HAS_MOVE_SEMANTICS
...
#endif

plutôt que simplement sur le compilateur, version ou quoi que ce soit.

16voto

Luchian Grigore Points 136646

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
 

3voto

Edward Brey Points 8771

Le Coup De Pouce.Config bibliothèque fournit granulaire préprocesseur macros vous pouvez utiliser de la compilation conditionnelle, basée sur la présence d'une C++11 fonctionnalité.

(Pour un compilateur C++11 n'a pas besoin d'être tout ou rien la proposition. Par exemple, considérez la façon dont Microsoft cerise cueillies qui C++11 caractéristiques à inclure dans Visual Studio 2012 en fonction de ce qu'ils croyaient seraient les plus avantageux pour leurs clients.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X