Мой системный компилятор (gcc42) хорошо работает с функциями TR1, которые я хочу, но пытающийся поддерживать более новые версии компилятора кроме систем, пробуя к доступу к заголовкам TR1 #error, требующий-std=c ++ 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=c ++ 0x:
#include <foo>
using std::foo;
Там так или иначе использует пред процессор, который я могу сказать, работает ли g ++ с C++ 0x, функции включили?
Что-то вроде этого - то, что я ищу:
#ifdef __CXX0X_MODE__
#endif
но я ничего не нашел в руководстве или от сети.
Таким образом, я начинаю думать, что жизнь просто была бы легче, для использования Повышения в качестве зависимости и не беспокойства о новом стандарте языка, прибывающем перед TR4... hehe.
Если вы компилируете с -std=c++0x
, то __GXX_EXPERIMENTAL_CXX0X__
будет определено.
Кажется, что в gcc 4.4.4 есть только один предопределенный макрос, намекающий на то, что действует -std = c ++ 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