Предопределенный макрос C ++ 11 - PullRequest
23 голосов
/ 29 августа 2011

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

Например, в настоящее время большинство компиляторов помещает массив в папку "tr1", но для C ++ 11 это будет частью STL,Так что в настоящее время

#include <tr1/array>

но c ++ 11

#include <array>

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

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

Спасибо

Ответы [ 4 ]

20 голосов
/ 29 августа 2011

С здесь

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

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

7 голосов
/ 01 сентября 2011

Из черновика 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.
7 голосов
/ 29 августа 2011

Nitpick ...

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

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

И все готово.

1 голос
/ 29 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...