Ответ 1
Если вы скомпилируете с -std=c++0x
, тогда будет определено __GXX_EXPERIMENTAL_CXX0X__
.
Мой системный компилятор (gcc42) отлично работает с функциями TR1, которые я хочу, но стараюсь поддерживать более новые версии компилятора, отличные от систем, пытаясь получить доступ к заголовкам TR1 С#error, требующим опции -std = С++ 0x, потому что о том, как он взаимодействует с библиотекой или некоторым хабом-хабом.
/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.
Приобретение дополнительного коммутатора не представляет проблемы, чтобы поддерживать GCC 4.4 и 4.5 в этой системе (FreeBSD), но, очевидно, это меняет картину!
Использование моего системного компилятора (диалект g++ 4.2 по умолчанию):
#include <tr1/foo>
using std::tr1::foo;
Использование новых (4.5) версий компилятора с -std = С++ 0x:
#include <foo>
using std::foo;
В любом случае, используя предварительный процессор, я могу сказать, включен ли g++ с включенными функциями С++ 0x?
Что-то вроде этого - это то, что я ищу:
#ifdef __CXX0X_MODE__
#endif
но я ничего не нашел в руководстве или в Интернете.
С такой скоростью я начинаю думать, что жизнь будет проще, использовать Boost как зависимость, а не беспокоиться о новом языковом стандарте, прибывшем перед TR4... хе-хе.
Если вы скомпилируете с -std=c++0x
, тогда будет определено __GXX_EXPERIMENTAL_CXX0X__
.
Кажется, с gcc 4.4.4, чтобы быть только одним предопределенным макросом, указывающим, что -std = С++ 0x действует:
#define __GXX_EXPERIMENTAL_CXX0X__ 1
У меня нет доступа к gcc 4.5.0, но вы можете проверить его самостоятельно:
[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
Для однострочной команды 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
дает вам что-то вроде:
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
Ну, из gcc-4.7 вы сможете проверить __cplusplus:
"g++ теперь устанавливает предопределенный макрос __cplusplus в правильное значение, 199711L для С++ 98/03 и 201103L для С++ 11"
Это должен быть правильный, стандартизованный способ сделать это. К сожалению, он не работает для большинства gcc, установленных в дикой природе.