Ответ 1
От здесь
В С++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.
Вероятно, вы можете проверить его значение, чтобы определить, если он С++ 0x или нет, то
Существуют ли какие-либо предопределенные макросы для С++, чтобы код мог идентифицировать стандарт?
например. В настоящее время большинство компиляторов помещает "массив" в папку "tr1", но для С++ 11 он будет частью STL. Итак, в настоящее время
#include <tr1/array>
но С++ 11
#include <array>
Каковы предопределенные макросы для стандартного стандарта 03 и 11, чтобы я мог использовать #ifdef
для идентификации?
Кроме того, я полагаю, существуют макросы для C90 и C99?
Thanksx
От здесь
В С++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.
Вероятно, вы можете проверить его значение, чтобы определить, если он С++ 0x или нет, то
придираться...
Ваша конкретная проблема не зависит от вашего компилятора, это зависит от реализации стандартной библиотеки.
Поскольку вы можете выбрать другую стандартную библиотеку, предоставленную вашим компилятором (например, опробовав libС++ или stlport), вам не поможет никакая информация о конкретном компиляторе.
Лучше всего создать собственный заголовочный файл самостоятельно, в котором вы будете выбирать один или другой (в зависимости от варианта сборки).
// array.hpp
#ifdef STD_HAS_TR1_ARRAY_HEADER
#include <tr1/array>
#else
#include <array>
#endif
Затем вы задокументируете параметр компилятора:
Передача
-DSTD_HAS_TR1_ARRAY_HEADER
будет означать, чтоstd::tr1::array
определяется в<tr1/array>
вместо стандартного<array>
.
И все готово.
Из черновика N3242:
16.8 Predefined macro names [cpp.predefined]
...
The name _ _ cplusplus is defined to the value 201103L when
compiling a C++ translation unit. 155)
...
155) It is intended that future versions of this standard will
replace the value of this macro with a greater value.
Non-conforming compilers should use a value with at most five
decimal digits.
В конечном итоге вам придется использовать информацию, относящуюся к компилятору. По крайней мере, до тех пор, пока С++ 0x не станет более широко распространенным. Вам в основном нужно выбрать версии драйверов, которые что-то реализуют, и тестировать на них макросы для компилятора.
Библиотека Boost.Config содержит несколько макросов, которые могут вам помочь.