37 votes

GNU C ++ comment vérifier quand -std = c ++0x est en vigueur?

Mon compilateur système (gcc42) fonctionne très bien avec les fonctionnalités TR1 que je veux, mais en essayant de soutenir à nouveau compilateur versions autres que les systèmes, en essayant d'accéder à TR1-têtes de une #erreur en exigeant la -std=c++0x option, car de la façon dont il interagit avec bibliothèque ou un hub bub comme ça.

/usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

Avoir à fournir un interrupteur supplémentaire n'est pas un problème, à l'appui de GCC 4.4 et 4.5 en vertu de ce système (FreeBSD), mais, évidemment, ça change de la photo!

L'utilisation de mon système compilateur g++ 4.2 défaut dialecte):

#include <tr1/foo>
using std::tr1::foo;

Utilisant les nouvelles (4.5) versions du compilateur avec -std=c++0x:

#include <foo>
using std::foo;

Est-il de toute façon à l'aide de la pré-processeur, que je ne peux dire si g++ est en cours d'exécution avec le C++0x fonctionnalités permis?

Quelque chose comme ceci est ce que je suis à la recherche de:

#ifdef __CXX0X_MODE__
#endif

mais je n'ai rien trouvé dans le manuel ou sur le web.

À ce rythme, je commence à penser que la vie serait plus facile, pour utiliser Boost comme une dépendance, et ne pas s'inquiéter d'une nouvelle langue standard d'arriver avant TR4... hehe.

82voto

nos Points 102226

Avec gcc 4.4.4, il ne semble y avoir qu’une seule macro prédéfinie indiquant que -std = c ++ 0x est en vigueur:

 #define __GXX_EXPERIMENTAL_CXX0X__ 1
 

Je n'ai pas accès à gcc 4.5.0, mais vous pouvez le vérifier vous-même:

 [16:13:41 0 ~] $ g++ -E -dM -std=c++0x -x c++ /dev/null >b
[16:13:44 0 ~] $ g++ -E -dM -std=c++98 -x c++ /dev/null >a
[16:13:50 0 ~] $ diff -u a b
--- a   2010-06-02 16:13:50.200787591 +0200
+++ b   2010-06-02 16:13:44.456912378 +0200
@@ -20,6 +20,7 @@
 #define __linux 1
 #define __DEC32_EPSILON__ 1E-6DF
 #define __unix 1
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
 #define __LDBL_MAX_EXP__ 16384
 #define __linux__ 1
 #define __SCHAR_MAX__ 127
 

Pour une commande en une ligne,

 g++ -E -dM -std=c++98 -x c++ /dev/null > std1 && g++ -E -dM -std=c++0x -x c++ /dev/null > std2 && diff -u std1 std2 | grep '[+|-]^*#define' && rm std1 std2
 

vous donne quelque chose comme:

 +#define __GXX_EXPERIMENTAL_CXX0X__ 1
 

36voto

James McNellis Points 193607

Si vous compilez avec -std=c++0x , alors __GXX_EXPERIMENTAL_CXX0X__ sera défini.

17voto

emsr Points 4616

Eh bien, à partir de gcc-4.7 , vous pourrez vérifier __cplusplus:

"G ++ définit maintenant la macro prédéfinie __cplusplus sur la valeur correcte, 199711L pour C ++98/03 et 201103L pour C ++11"

Cela devrait être la manière correcte et conforme à la norme de le faire. Malheureusement, cela ne fonctionne pas pour la plupart des gcc installés dans la nature.

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