Подтвердить что ты не робот

Предопределенный макрос С++ 11

Существуют ли какие-либо предопределенные макросы для С++, чтобы код мог идентифицировать стандарт?

например. В настоящее время большинство компиляторов помещает "массив" в папку "tr1", но для С++ 11 он будет частью STL. Итак, в настоящее время

#include <tr1/array>

но С++ 11

#include <array>

Каковы предопределенные макросы для стандартного стандарта 03 и 11, чтобы я мог использовать #ifdef для идентификации?

Кроме того, я полагаю, существуют макросы для C90 и C99?

Thanksx

4b9b3361

Ответ 1

От здесь

В С++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.

Вероятно, вы можете проверить его значение, чтобы определить, если он С++ 0x или нет, то

Ответ 2

придираться...

Ваша конкретная проблема не зависит от вашего компилятора, это зависит от реализации стандартной библиотеки.

Поскольку вы можете выбрать другую стандартную библиотеку, предоставленную вашим компилятором (например, опробовав 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>.

И все готово.

Ответ 3

Из черновика 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.

Ответ 4

В конечном итоге вам придется использовать информацию, относящуюся к компилятору. По крайней мере, до тех пор, пока С++ 0x не станет более широко распространенным. Вам в основном нужно выбрать версии драйверов, которые что-то реализуют, и тестировать на них макросы для компилятора.

Библиотека Boost.Config содержит несколько макросов, которые могут вам помочь.