GNU C++ jak sprawdzić kiedy działa-std = c++0x?

Mój kompilator systemu (gcc42) działa dobrze z funkcjami TR1, które chcę, ale próbuję obsługiwać nowsze wersje kompilatora inne niż systemy, próbując uzyskać dostęp do nagłówków TR1, błąd #wymagający opcji-std=c++0x z powodu tego, jak łączy się z biblioteką lub jakimś hubem.

/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.

Konieczność dostarczenia dodatkowego przełącznika nie stanowi problemu, aby obsługiwać GCC 4.4 i 4.5 pod tym systemem (FreeBSD), ale oczywiście zmienia to obraz!

Using my system compiler (g++ 4.2 dialekt domyślny):

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

Użycie nowszych (4.5) wersji kompilatora z -std=c++0x:

#include <foo>
using std::foo;

Czy i tak używam pre procesora, że mogę stwierdzić, czy g++ działa z włączonymi funkcjami C++0x?

CzegoÅ› takiego Szukam :

#ifdef __CXX0X_MODE__
#endif

Ale nie znalazłem nic w instrukcji ani poza siecią.

W tym tempie, zaczynam myśleć, że życie byłoby po prostu łatwiejsze, używać Boost jako zależności, a nie martwić się o nowy standard językowy przybywa przed TR4... hehe.
Author: TerryP, 2010-06-02

3 answers

Jeśli kompilujesz z -std=c++0x, to __GXX_EXPERIMENTAL_CXX0X__ zostanie zdefiniowane.

 36
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-02 14:00:32

Wydaje się, że w gcc 4.4.4 jest tylko jedno predefiniowane makro, sugerujące ,że-std = c++0x jest w efekcie:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Nie mam dostępu do gcc 4.5.0, ale sam możesz to sprawdzić:

[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

Dla polecenia jednowierszowego do,

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

Daje coÅ› w stylu:

+#define __GXX_EXPERIMENTAL_CXX0X__ 1
 82
Author: nos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 08:00:41

Cóż, od gcc-4.7 będziesz mógł sprawdzić _ _ cplusplus:

"G++ ustawia teraz predefiniowane makro _ _ cplusplus na prawidłową wartość, 199711L dla C++98/03 i 201103l dla C++11"

Powinien to być prawidłowy, zgodny ze standardami sposób. Niestety, nie działa to dla większości gcc zainstalowanych na wolności.

 17
Author: emsr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 15:20:36