web-dev-qa-db-fra.com

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

Mon compilateur système (GCC42) fonctionne bien avec les fonctionnalités de TR1 que je veux, mais essayant de soutenir les versions de compilateur plus récentes autres que les systèmes, en essayant d'accéder à des en-têtes TR1 et d'exiger une option exigeant -std = C++ 0x en raison de la façon dont il interfaces avec la bibliothèque ou une 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 commutateur supplémentaire n'est pas un problème, de prendre en charge GCC 4.4 et 4.5 sous ce système (FreeBSD), mais il change évidemment la photo!

Utilisation de mon compilateur système (Dialecte par défaut G ++ 4.2):

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

Utilisation de nouvelles versions (4.5) du compilateur avec -std = C++ 0x:

#include <foo>
using std::foo;

Y a-t-il de toute façon à l'aide du pré-processeur, que je puisse dire si g ++ fonctionne avec des fonctionnalités C++ 0X activées?

quelque chose comme c'est ce que je cherche:

#ifdef __CXX0X_MODE__
#endif

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

À ce rythme, je commence à penser que la vie serait simplement plus facile, d'utiliser Boost comme une dépendance et de ne pas vous inquiéter d'une nouvelle norme de langue arrivant avant TR4 ... HEHE.

37
TerryP

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

36
James McNellis

Il semble que la GCC 4.4.4, soit une seule indication de macro prédéfinie 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 vérifier celui-ci 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 la commande d'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

te donne quelque chose comme:

+#define __GXX_EXPERIMENTAL_CXX0X__ 1
82
nos

Eh bien, à partir de - GCC-4.7 En avant, vous pourrez vérifier __cplusplus:

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

Cela devrait être le moyen correct et compatible standard de le faire. Malheureusement, cela ne fonctionne pas pour la plupart des GCC installés à l'état sauvage.

17
emsr