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.3 answers
Jeśli kompilujesz z -std=c++0x
, to __GXX_EXPERIMENTAL_CXX0X__
zostanie zdefiniowane.
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
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.
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